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

  • 相关阅读:
    heat模板
    Leetcode812.Largest Triangle Area最大三角形面积
    Leetcode812.Largest Triangle Area最大三角形面积
    Leetcode811.Subdomain Visit Count子域名访问计数
    Leetcode811.Subdomain Visit Count子域名访问计数
    Leetcode806.Number of Lines To Write String写字符串需要的行数
    Leetcode806.Number of Lines To Write String写字符串需要的行数
    Leetcode819.Most Common Word最常见的单词
    Leetcode819.Most Common Word最常见的单词
    Leetcode783.Minimum Distance Between BST Nodes二叉搜索树结点最小距离
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3358125.html
Copyright © 2011-2022 走看看