git-svn 简单教程(转)

1、从svn clone出项目,加上-s参数以标记识别svn标准的目录分支结构,同时通过show-ignore设置git库的exclude属性:

git svn clone -s https://svn.xxx.com/svn/xxx git svn show-ignore » .git/info/exclude ####2、建立本地工作分支,开始工作:

git checkout -b work 修改内容直接commit,加上-a开头以省略git add操作:

git commit -a ####3、提交回svn的过程:

git checkout master
git merge work
git svn rebase
git svn dcommit

在今天工作中,我提交回svn的方式是:

git checkout master
git svn rebase
git merge work

结果svn rebase时在master分支上产生了一个新的node,这样merge时就不能快速合并,出现了冲突,修复后,在dcommit时出错,出现N个孤立节点。因为不熟悉,就checkout出work分支,进行了dcommit,然后重新生成一次git库。

今天解决了这个问题,参考以下网址:https://wiki.bnl.gov/dayabay/index.php?title=Synchronizing_Repositories

以下重新描述一下问题和解决方法:

1、在执行git svn dcommit时,出现如下错误:

Committing to https://svn.xxx.com/svn/projects/trunk …

提交时发生合并冲突: 您的文件或目录”test/functional/xxx_controller_test.rb“可能已经过时: The version resource does not correspond to the resource within the transaction. Either the requested version resource is out of date (needs to be updated), or the requested version resource is newer than the transaction root (restart the commit). at /usr/bin/git-svn line 450

2、这时,重新执行以下步骤即可:

git svn fetch
git svn rebase
git svn dcommit

但我在执行git svn rebase时,又出现冲突,这个时候,只需要手工合并掉冲突,并重新add一下:

git add .

然后,再执行:

git rebase –continue

如果报告说没有修改内容,则换成执行:

git rebase –skip

完成rebase过程,这时就可以git svn dcommit了。 这样,总算解决了svn历史冲突问题,不用象前面那样笨笨的重新git-svn clone.

git是源于linux内核源码的管理,自然更适合在linux系统下使用。 在windows环境下,主要有2种方式:msysgit和cygwin内置的git(需要选择安装)。 个人建议使用cygwin git,msysgit的编码问题确实让人头痛。 当然,如果要使用图形工具Tortoisegit,就必须安装msysgit了。

cygwin配置: *在/etc/profile末尾加上一行:. “$HOME/.bashrc” *在$HOME目录下新建.bashrc文件,写入一行:source /etc/bash-completion.d/git *set CYGWIN=tty notitle glob *set LANG=zh_CN

git及git-svn使用:

下载svn源码:git svn clone http://xxxx myproject (相当于svn checkout)

建立临时分支:git branch aaa 切换到临时分支:git checkout aaa 提交:git add . 提交确认:git commit 提交及确认:git commit -a (git add . + git commit,但新增文件必须要git add .)

切换回master分支:git checkout master 合并临时分支:git merge aaa 删除临时分支:git branch -d aaa

从svn更新: git svn rebase (相当于svn update) 提交至svn: git svn dcommit (相当于svn commit)

查看状态:git status 查看diff:git diff,git diff head

git svn rebase 冲突:

git add . 然后,再执行: git rebase –continue 如果报告说没有修改内容,则换成执行: git rebase –skip

图示

转自:http://www.cppblog.com/niewenlong/archive/2013/06/04/200791.html