zoukankan      html  css  js  c++  java
  • Subversion/Git/ReviewBoard工作流程

    根据My (work)Git Workflow进行修改,在
    Windows下进行测试,http://mojodna.net/2009/02/24/my-work-git-workflow.html

    目标:中心库使用subversion,使用Review Board作为项目组的Review工具,要求所有代码先Reivew才能提交。Subversion本身不支持本地分支,如何在等待和修改reivew的过程中继续新的特性开发,操作比较复杂。

    解决方案:使用git-svn跟踪本地分支,对应不同需要review的分支。

    预先准备

    假定安装好了git for windows 1.8.x.

    Reviewboard需要svn版本的diff文件格式,无法用git直接生成。需要一个附加的bash脚本把git格式的patch转换成svn格式。GitHub上有多个版本脚本,目前为止找到的最完善的版本是https://gist.github.com/rage-shadowman/6325382

    #!/bin/bash

    #

    # git-svn-difforiginally by (http://mojodna.net/2009/02/24/my-work-git-workflow.html)

    # modified bymike@mikepearce.net

    # modified byaconway@[redacted] - handle diffs that introduce new files

    # modified byt.broyer@ltgt.net - fixes diffs that introduce new files

    # modified bym@rkj.me - fix sed syntax issue in OS X

    # modified byrage-shadowman - cleaned up finding of SVN info and handling of path parameters

    # modified bytianyapiaozi - cleaned up some diff context lines

    #

    # Generate anSVN-compatible diff against the tip of the tracking branch

     

    # Usage:git-svn-diff.sh FROM TO

    #    or: git-svn-diff.sh TO

    #    or: git-svn-diff.sh

    #

    # Gets the SVNdiff from the latest dcommitted version of FROM to the latest version of TO

     

    usage_exit ()

    {

       echo

       echo "Gets the SVN compatible diff fromthe latest dcommitted version of FROM to the latest version of TO"

       echo

       echo "Usage: $0 FROM TO"

       echo "  or: $0 TO"

       echo "  or: $0"

       echo

       echo "If FROM is not supplied we willuse the latest dcommitted version of HEAD"

       echo

       echo "If TO is not supplied we will usethe latest (possibly non-committed) version of HEAD"

       echo

       exit 1;

    }

     

    FROM=${2:+$1}

    TO=${2:-$1}

     

    # make sure FROMand TO exist or were not specified

    if ! gitshow-branch $FROM >/dev/null 2>&1

    then

       usage_exit

    fi

     

    if ! gitshow-branch $TO >/dev/null 2>&1

    then

       usage_exit

    fi

     

    LATEST_DCOMMIT_HASH=`gitlog $FROM --grep=^git-svn-id: --first-parent -1|grep ^commit|sed 's/^commit//'`

    SVN_REV=`git svnfind-rev $LATEST_DCOMMIT_HASH`

     

    # do the diffand masssage into SVN format

    git diff--no-prefix $LATEST_DCOMMIT_HASH $TO |

    sed -e"/--- /dev/null/{ N; s|^--- /dev/null +++ (.*)|--- 1      (revision 0) +++ 1 (working copy)|;}"

        -e "s/^--- .*/&      (revision $SVN_REV)/"

        -e "s/^+++ .*/&   (working copy)/"

        -e "s/^(@@.*@@).*/1/"

        -e "s/^diff --git[^[:space:]]*/Index:/"

        -e"s/^index.*/===================================================================/"

        -e "/^new file mode [0-9]+$/d"

     

    需要把git-svn-diff.sh文件放到PATH指向的路径之中。同时,修改~/.gitconfig来激活git svn-diff命令。

    # ~/.gitconfig

    [alias]

      svn-diff =!git-svn-diff.sh

    在linux下也许不需要.sh,没有测试。Windows下必须是全文件名。

    工作流程

    原文中考虑了subversion的使用,为了简单起见,本文省略掉相关内容。Git-svn以及其他git操作解释请参考Pro Git。https://github.com/progit/progit。所有操作以git bash为准。为了准确看到分支的情况,推荐使用sourcetree,但是,sourcetreefor windows 1.2还不能完整支持git-svn操作。不推荐tortoiseGit,右键菜单的方式不利于了解分支的情况。

    建立目录

    Clone目标subversion库:

    $ git svn clone http://svn.host/path/to/repo

    http://svn.host/path/to/repo路径最好对应ReviewBoard中设置的base path,保证提交的path路径正确。

    修改bug、实现特性

    确保目前处在最新状态:

    [master] $ git svn rebase

    创建一个分支并且切换到这个分支(最好使用一个容易识别的名称):

    [master] $ git checkout -b bug-42-title

    进行修改:

    [bug-42-title] $ ...

    把分支提交到本地git库中:

    [bug-42-title] $ git commit –am “bug-42modify balabala.”

    创建一个供review的patch:

     [bug-42-title]$ git svn-diff > bug-42-title.patch

    这个比较是和当前的svn本地数据比较。

    提交到reviewboard。

    等待review的过程中,继续开发,切换回主分支,创建新的分支

    [bug-42-title] $ git checkout master

    [master] $ git svn rebase

    [master] $ git checkout –b anotherfeature

    [anotherfeature] $…

    更新追踪分支

    Patch被review了,你需要继续进行修改。

    更新追踪分支:

    [master] $ git svn rebase

    把trunk中的内容衍合到开发分之中:

    [master] $ git checkout bug-42-title

    [bug-42-title] $ git rebase master

    [bug-42-title] $ # 解决冲突; `gitmergetool` is handy

    …进行必要的修改…

    提交到本地git库中:

    [bug-42-title] $ git commit –am “bug-42fixed other balabala”

    重新生成patch

    [bug-42-title] $ git svn-diff >bug-42-title-2.patch

    提交Review.

    把结果提交到Subversion:

    有几种可能的提交方法:

    简单把修改merge到trunk中。

    [master] $ git svn rebase

    [master] $ git merge bug-42-title –m “review:idwhat you want say”

    这是唯一提交reviewid的机会。

    【不推荐】如果希望保存整个修改历史,更新trunk分支,衍合开发分支,然后再进行merge.

    [master] $ git svn rebase

    [master] $ git checkout bug-42-title

    [bug-42-title] $ git rebase master

    [bug-42-title] $ # resolve conflicts

    [bug-42-title] $ git checkout master

    [master] $ git merge bug-42-title –m “review:idwhat you want say”

    如果希望得到一个好看的结果,可以使用交互式衍合(interactive rebase)。

    [bug-42-title] $ git rebase -i

    [bug-42-title] $ git checkout master

    [master] $ git merge bug-42-title –m “review:idwhat you want say”

    然后,我们就可以把修改正式提交到Subversion的中心库了。

    [master] $ git svn dcommit

    最后,在所有都完成之后,你就可以清理本地库删掉开发分支了。

    [master] $ git branch -d bug-42-title

  • 相关阅读:
    phpStorm激活码
    找回自己
    延迟加载JavaScript
    [MAC]如何通过 macOS 恢复功能重新安装 macOS
    Realm JavaScript
    Realm .NET
    [MAC]获得在线帮助:恢复信息
    [Swift]UILabel文字截断
    算法和数据结构可视化
    Realm Swift
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3358125.html
Copyright © 2011-2022 走看看