我尝试git-svn的动机是轻松融合和分支。然后我注意到男人git-svn(1)说:
不建议在您计划的分支上运行git-merge或git-pull 来自。 Subversion不代表任何合并 合理或有用的时尚;所以使用Subversion的用户看不到任何内容 合并你做的。此外,如果您从git合并或拉出 作为SVN分支的镜像的分支,dcommit可能会提交给 错误的分支。
这是否意味着我无法从svn / trunk(或分支)创建本地分支,破解,合并回svn / trunk,然后dcommit?我知道svn用户会看到同样的混乱,在svn pre 1.5.x中一直是合并,但是还有其他缺点吗?最后一句也让我担心。人们经常做这些事吗?
答案 0 :(得分:173)
实际上,我在git merge上使用--no-ff
选项找到了更好的方法。
我以前用过的所有这种壁球技术都不再需要了。
我的新工作流程现在如下:
我有一个“master”分支,它是我提交的唯一分支,克隆SVN存储库(-s
假设您在存储库trunk/
中有一个标准的SVN布局, branches/
和tags/
):
git svn clone [-s] <svn-url>
我在本地分支“work”工作(-b
创建分支“work”)
git checkout -b work
在本地提交到“work”分支(-s
以签署您的提交消息)。在续集中,我假设你做了3次本地提交
...
(work)$> git commit -s -m "msg 1"
...
(work)$> git commit -s -m "msg 2"
...
(work)$> git commit -s -m "msg 3"
[最终]存储您不希望在SVN服务器上看到的修改(通常您只是因为想要加速编译并专注于给定的功能而在主文件中注释了一些代码)< / p>
(work)$> git stash
使用SVN存储库重新绑定主分支(从SVN服务器更新)
(work)$> git checkout master
(master)$> git svn rebase
返回工作分支并与主人
重新绑定(master)$> git checkout work
(work)$> git rebase master
确保一切正常,例如:
(work)$> git log --graph --oneline --decorate
现在是时候使用这个精彩的--no-ff
选项将所有三个提交从“工作”分支合并到“主”中
(work)$> git checkout master
(master)$> git merge --no-ff work
您可以注意到日志的状态:
(master)$> git log --graph --oneline --decorate
* 56a779b (work, master) Merge branch 'work'
|\
| * af6f7ae msg 3
| * 8750643 msg 2
| * 08464ae msg 1
|/
* 21e20fa (git-svn) last svn commit
现在你可能想要编辑(amend
)你的SVN家伙的最后一次提交(否则他们只会看到一个提交消息“合并分支'工作'”
(master)$> git commit --amend
最后在SVN服务器上提交
(master)$> git svn dcommit
返回工作并最终恢复藏匿的文件:
(master)$> git checkout work
(work)$> git stash pop
答案 1 :(得分:49)
使用git-svn绝对可以创建本地分支。只要你自己只使用本地分支,而不是尝试使用git在上游svn分支之间进行合并,你应该没问题。
我有一个“master”分支,用于跟踪svn服务器。这是我唯一提出的分支。如果我正在做一些工作,我会创建一个主题分支并继续努力。当我想提交它时,我会执行以下操作:
我还有另一种情况需要维护一些本地更改(用于调试),这些更改永远不应该推送到svn。为此,我有上面的主分支,但也有一个叫做“工作”的分支,我通常在那里工作。主题分支是分支工作。当我想在那里提交工作时,我会检查master并使用cherry-pick来从我想要提交给svn的工作分支中选择提交。这是因为我想避免提交三个本地更改提交。然后,我从主分支中提交并重新安装所有内容。
首先运行git svn dcommit -n
以确保您准确提交您打算提交的内容是值得的。与git不同,在svn中重写历史很难!
我觉得必须有一个更好的方法来合并主题分支上的更改,同时跳过那些本地更改提交而不是使用cherry-pick,所以如果有人有任何想法,他们将受到欢迎。
答案 2 :(得分:33)
答案 3 :(得分:8)
可以通过对git-merge使用“--ff-only”标志来确保,但我通常不在分支中运行“git svn rebase”,只在其上运行“git rebase master”(假设它是只有当地的分支机构)。然后,“git merge thebranch”保证快进。
答案 4 :(得分:6)
在git中合并svn分支的一种安全方法是使用git merge --squash。这将创建一个提交并停止添加消息。
假设您有一个主题svn分支,称为svn-branch。
git svn fetch
git checkout remotes/trunk -b big-merge
git merge --squash svn-branch
此时你将svn-branch中的所有更改压缩成一个在索引中等待的提交
git commit
答案 5 :(得分:5)
将本地git分支重新引导到主git分支然后dcommit,这样看起来你按顺序完成了所有这些提交,所以svn人们可以像他们习惯的那样线性地看到它。假设您有一个名为topic的本地分支,您可以这样做
git rebase master topic
然后将通过主分支播放您的提交,准备好您提交