所以我正在使用git并与svn repo进行交互。
我有一个看起来像这样的svn TRUNK:
A-B-C-D
一个svn bug_fixes分支在提交B或C分支:
-c-d-e-f-g-h-i
现在我需要将svn分支中的cdefghi提交返回到主分支。
我知道我可以做一个被压扁的提交,让我们称之为压缩SQUASH(它将包含cdefghi),但是后来似乎我必须杀死bug_fixes分支并启动一个新分支才能干净地继续。
此处:http://blog.red-bean.com/sussman/?p=92他们建议:
checkout
分支。
merge
主人对分支的更改。
Checkout
主人。
merge --reintegrate
分支机构对主人的更改。
继续发展。
不幸的是,git-svn似乎没有认识到svn的任何“merge --reintegrate”命令。
那么我如何干净地使分支和master拥有所有提交,以便使用git-svn的命令继续开发两者?
答案 0 :(得分:7)
Caveats section of the git-svn
documentation发出警告
为了简化并与功能较弱的系统(SVN)进行互操作,建议所有
git svn
用户clone
,fetch
和dcommit
直接来自SVN服务器,并避免git存储库和分支之间的所有git clone
/pull
/merge
/push
操作。
作者提供了一个建议:
在git分支和用户之间交换代码的推荐方法是
git format-patch
和git am
,或只是dcommit
到SVN存储库。
适应您的情况
git format-patch --stdout c^..i >my.patch
git reset --hard trunk
git am <my.patch
其中c
和i
是您历史记录中提交的适当标识符。
答案 1 :(得分:3)
好的,我发现了一些方法:
git checkout your_branch
git rebase master
git checkout master
git merge your_branch
或
git checkout your_branch
git rebase master
git checkout master
git merge --squash your_branch
或
git checkout your_branch
git rebase master
git checkout master
git rebase -i your_branch
然后毕竟。
git svn dcommit (to commit to master)
git branch -D your_branch
然后(从svn因为git-svn不支持删除)删除分支, 并从主干重新创建它并重新开始循环。
答案 2 :(得分:1)
将您的本地资源(<branchpoint>..i
)重新定位到从SVN获取的新主服务器时,这不是一个好的案例吗?
答案 3 :(得分:1)
如果您提交合并,它会自动将其压缩为1次提交。遗憾的是它没有在内部使用svn:mergeinfo或--reintegrate,因此你失去了与通过'git svn branch'创建的分支的关联。
答案 4 :(得分:1)
如果你不使用 merge ,你还能做的是 cherry-pick 。
两个语句都应该在没有更改的分支上完成。
如果c比我年长,并且您想要采用整个序列。
git cherry-pick c..i
或单独提交
git cherry-pick c d e f g h i