git-svn:如何保持git仓库和svn仓库同步

4
我们有一个新的git仓库,它是从一个svn仓库转换而来。现在这个git仓库是主要的仓库,后续的开发都将在这里进行。该仓库是托管在服务器上的。 另一方面,svn仓库将作为发布管道保留给非git用户使用。 问题是,如何定期从git仓库更新svn仓库?我阅读了很多关于git-svn的文章,其中提到不应该使用合并等操作(请参见Is git-svn dcommit after merging in git dangerous?)。 但是,在git仓库中会发生合并,我们不想通过奇怪的规则(比如“只允许使用变基”)限制git仓库的开发。 所以问题很简单:是否有最佳实践可以保持svn仓库与git仓库同步(比如每两周同步一次)?甚至可能安全地从svn重新传输更改到git(以防需要对svn仓库进行紧急修复,因此这种情况很少发生)。 由于新的git仓库是托管在服务器上的,必须有一个svn-git仓库作为中介者。该仓库可以用来将git合并重定向到git变基等操作。如果所有中间git提交作为一个大块提交到svn仍然是合理的。
2个回答

2
我有一个略微不同的设置:SVN仓库没有从Git仓库克隆而来。
我的Git仓库主要有两个分支:mastersvnmaster与远程裸Git仓库同步,svn链接到远程SVN仓库。
我使用git cherry-pick将一侧的提交应用于另一侧,并且在重新定位和合并方面没有任何问题。
我以前尝试过将master合并到svn中,但总是最终陷入无休止的冲突解决会话中。当只使用cherry-picking时,生活会更轻松。
为了将svn提交合并到我的master中,我执行以下操作:
首先,使两个分支与其上游同步:
git checkout svn
git svn rebase

git checkout master
git pull

然后(在处于 master 分支时):

gitk svn

打开 gitk 窗口,选择从 svnmaster 要传输的提交记录。之后使用 git push 将这些提交应用到我的远程仓库。

要将更改从 master 传输到 svn,我 git checkout svn,然后启动 gitk master。再次选择要传输的提交记录,完成后,git svn dcommit 将提交推送到 SVN 服务器。

简单而无痛苦。


听起来非常有趣 - gitk是一个“传输工具” ;-) 我会尝试一下! - Udo
@Udo:当然,你也可以使用命令行和git cherry-pick,但我发现 GUI 更方便。如果你正在使用 TortoiseGit,甚至可以一次选择多个提交来挑选。 - eckes

1

在您的Git存储库中,您可以执行任何合并操作,只要您不将正在提交回SVN的分支进行变基。
只要您不重写该分支中的任何历史记录,您就可以自由地管理您的Git存储库工作流程。

因此,最佳实践是尽量减少与您的SVN存储库同步的分支数量,以便于管理那些“公共”分支(“公共”指对所有git用户和所有svn用户可见)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接