根据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工作流程的更多相关文章

  1. 【Git项目管理】分布式 Git - 分布式工作流程

    分布式 Git - 分布式工作流程 你现在拥有了一个远程 Git 版本库,能为所有开发者共享代码提供服务,在一个本地工作流程下,你也已经熟悉了基本 Git 命令.你现在可以学习如何利用 Git 提供的 ...

  2. git教程——工作流程

    Git 工作流程 本章节我们将为大家介绍 Git 的工作流程. 一般工作流程如下: 克隆 Git 资源作为工作目录. 在克隆的资源上添加或修改文件. 如果其他人修改了,你可以更新资源. 在提交前查看修 ...

  3. Git的工作流程

    git的工作流程为: 克隆Git资源作为工作目录 在克隆的资源上添加或者修改文件 如果别人修改了,你可以更新资源 在提交前查看修改 提交修改 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交 ...

  4. 4. Git基本工作流程

    4. Git基本工作流程 Git工作区域 向仓库中添加文件流程

  5. 基于git的工作流程

    本文针对的是追求极致.快速的产品响应团队的.以下的观点和内容都是围绕这个主题,暂时不涉及个人学习和团队学习. 在说工作流程之间,想说一下我们平常工作中遇到的一些困惑或者说现象 在一个团队里,同时有好多 ...

  6. git的工作流程(分支合并)

    git支持很多种工作流程,我们采用的一般是这样,远程创建一个主分支,本地每人创建功能分支,日常工作流程如下: 去自己的工作分支$ git checkout work 工作.... 提交工作分支的修改$ ...

  7. 理解Git的工作流程(转)

    英文原文:Understanding the Git Workflow 如果你不理解Git的设计动机,那你就会处处碰壁.知道足够多的命令和参数后,你就会强行让Git按你想的来工作,而不是按Git自己的 ...

  8. 1.Git起步-Git的三种状态以及三种工作区域、CVCS与DVCS的区别、Git基本工作流程

    1.Git基础 版本控制系统是一种用于记录一个或多个文件内容变化,以便将来查阅恢复特定版本修订情况的系统. Git是一种分布式版本控制系统(Distributed Version Control Sy ...

  9. Git分布式工作流程

    Git官网给出了三种分布式工作流程: 集中式工作流程 集成管理者工作流 司令官与副官工作流 这里以私有gitserver服务器上的git-test项目为例,简单说明集中式工作流程. 基于分支的开发策略 ...

随机推荐

  1. C++ 实现01背包动态规划

    简述一下01背包: 背包容量大小固定,有一些物品,每个物品都有重量和价值两个属性,且物品唯一不重复(即同一物品只能放入一个),放入物品的总重量不能超过背包容量 ,求放入背包的物品的总价值最大化.0代表 ...

  2. Spring Security Encryption三种加密方式

    Encryption One-way encryption       单项加密,客户端将要传递的值先加密(使用特定的加密方法),将原值和加密好的值传递过去,服务器端将原始数据也进行一次加密(两者加密 ...

  3. 受教了,memcache比较全面点的介绍,受益匪浅,适用memcached的业务场景有哪些?memcached的cache机制是怎样的?在设计应用时,可以通过Memcached缓存那些内容?

    基本问题 1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 ...

  4. Eyeshot Ultimate 学习笔记(1)

    在Winform项目中用到3D技术,这是在做项目一段时间以来第一次,还是指定的3D控件Eyeshot Ultimate,这个控件名称用度娘搜索,竟然毫无结果,不知道是没有人用过还是觉得该控件过于简单, ...

  5. quick-x 触摸事件的新方法

    --[[ local function onTouch(event, x, y) print(event, x, y) if event == "began" then retur ...

  6. ng-form

    form提供的属性都是用来表示表单的验证状态的,包括:$pristine(表单没有填写记录).$dirty(表单有填写记录).$valid(通过验证).$invalid(未通过验证).$error(验 ...

  7. java执行机制

    java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码 ...

  8. RPMForge——Quick Start build system

    How to setup multimedia on CentOS-5 CentOS ships with basic sound support for audio content encoded ...

  9. 2016030101 - ubuntu15.1上安装git客户端

    使用ubutun15.1安装git客户端. 根据git官网提示内容(参考http://git-scm.com/download/linux) 1.使用命令:sudo apt-get install g ...

  10. EQueue 2.3.2

    EQueue 2.3.2版本发布(支持高可用) 前言 前段时间针对EQueue的完善终于告一段落了,实在值得庆祝,自己的付出和坚持总算有了成果.这次新版本主要为EQueue实现了集群功能,基本实现了B ...