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\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
Subversion/Git/ReviewBoard工作流程的更多相关文章
- 【Git项目管理】分布式 Git - 分布式工作流程
分布式 Git - 分布式工作流程 你现在拥有了一个远程 Git 版本库,能为所有开发者共享代码提供服务,在一个本地工作流程下,你也已经熟悉了基本 Git 命令.你现在可以学习如何利用 Git 提供的 ...
- git教程——工作流程
Git 工作流程 本章节我们将为大家介绍 Git 的工作流程. 一般工作流程如下: 克隆 Git 资源作为工作目录. 在克隆的资源上添加或修改文件. 如果其他人修改了,你可以更新资源. 在提交前查看修 ...
- Git的工作流程
git的工作流程为: 克隆Git资源作为工作目录 在克隆的资源上添加或者修改文件 如果别人修改了,你可以更新资源 在提交前查看修改 提交修改 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交 ...
- 4. Git基本工作流程
4. Git基本工作流程 Git工作区域 向仓库中添加文件流程
- 基于git的工作流程
本文针对的是追求极致.快速的产品响应团队的.以下的观点和内容都是围绕这个主题,暂时不涉及个人学习和团队学习. 在说工作流程之间,想说一下我们平常工作中遇到的一些困惑或者说现象 在一个团队里,同时有好多 ...
- git的工作流程(分支合并)
git支持很多种工作流程,我们采用的一般是这样,远程创建一个主分支,本地每人创建功能分支,日常工作流程如下: 去自己的工作分支$ git checkout work 工作.... 提交工作分支的修改$ ...
- 理解Git的工作流程(转)
英文原文:Understanding the Git Workflow 如果你不理解Git的设计动机,那你就会处处碰壁.知道足够多的命令和参数后,你就会强行让Git按你想的来工作,而不是按Git自己的 ...
- 1.Git起步-Git的三种状态以及三种工作区域、CVCS与DVCS的区别、Git基本工作流程
1.Git基础 版本控制系统是一种用于记录一个或多个文件内容变化,以便将来查阅恢复特定版本修订情况的系统. Git是一种分布式版本控制系统(Distributed Version Control Sy ...
- Git分布式工作流程
Git官网给出了三种分布式工作流程: 集中式工作流程 集成管理者工作流 司令官与副官工作流 这里以私有gitserver服务器上的git-test项目为例,简单说明集中式工作流程. 基于分支的开发策略 ...
随机推荐
- CoreAnimation2-视觉效果和变换
圆角 圆角矩形是iOS的一个标志性审美特性.这在iOS的每一个地方都得到了体现,不论是主屏幕图标,还是警告弹框,甚至是文本框.按照这流行程度,你可能会认为一定有不借助Photoshop就能轻易创建圆角 ...
- 学习protobuf
一.认识Protobuf ref:http://blog.csdn.net/program_think/article/details/4229773摘要:1. protobuf是一个开源项目.2. ...
- window FILES——windows文件管理相关实例
C语言下有一套文件管理方案.C++语言下也有一套自己的文件管理方案.windows系统当然也有自己的一套文件管理方案啦.对于普通char类型为基础的字符使用哪种方案的解决办法都是一样的,但是对于宽字符 ...
- Windows phone 之常用控件
一.TextBox TextBox 显示和编辑单格式.多行文本的控件 将TextWrapping的特性设置为Wrap会使文本在到达TextBox控件的边缘时换至新行.必要时会自动扩展TextBox以便 ...
- LVS高可用集群
高可用LVS 集群构建 在LVS集群当中Director的作用是很关键的,所以我们在生产环境中要保证其高可用. 高可用架构图: 1.通过 piranha搭建LVS高可用性集群 piranha是REDH ...
- JavaScript 高阶函数 + generator生成器
map/reduce map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果: function pow(x ...
- winform下mapxtreme2008 v7.0 生成release版提示找不到dll问题
在winform下基于mapxtreme2008 v7.0 生成了一个地图软件,用debug方式运行无误,但改为release版时提示缺少一大堆dll,如: 无法从C:\Program Files ( ...
- angularjs入门整理
之前发过一篇博文,从mobile angular ui的demo和其官网初识整个angularjs的大体使用,但是没很好学习,只是通过一些技术博文初步认识,陷入很多坑.所以现在在中文官网正式整理下知识 ...
- mysql的查询缓存模式介绍
mysql的查询缓存 查询是数据库技术中最常用的操作.查询操作的过程比较简单,首先从客户端发出查询的SQL语句,数据库服务端在接收到由客户端发来的 SQL语句后, 执行这条SQL语句,然后将查询到的结 ...
- jquery 中 form的使用
纠结了一下 form 表单的提交响应事件,因为在表单中,form标签会让浏览器自动提交,而我一直写的是 $(".btn").click(function()) 提交按钮的响应事件, ...