当前位置:编程学习 > 网站相关 >>

Subversion/Git/ReviewBoard工作流程

目标:中心库使用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\n+++ \(.*\)|--- \1      (revision 0)\n+++ \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
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,