2011-08-09 129 views
4

我们有一个新的git repo,从svn repo中激怒了。 git repo现在是进一步开发的主要存储库。这个回购是一个托管的回购。 另一方面的svn回购将作为非git用户的发布渠道。 问题是,如何从git repo不时更新svn回购?我读了很多关于git-svn的内容,并且不应该使用merge等(请参阅Is git-svn dcommit after merging in git dangerous?)。 但合并会发生在git仓库中,我们不想通过奇怪的规则来限制git仓库的开发(比如“只允许rebase”)。git-svn:保持git repo和svn repo同步

所以问题很简单:他们是如何保持svn repo与git repo同步的最佳做法(比方说每两周)。是否有可能将更改从svn安全地重新传输到git(如果必须对svn repo应用紧急修复程序,则很少会发生这种情况)。

由于新的git repo是托管的,所以在中间必须有一个svn-git repo作为中介。这个回购可以用来将git-merges重新链接成git-rebases左右。所有中间的git提交都作为一个blob委托给SVN也是非常好的。

回答

1

你可以在你的Git仓库中做任何你想要的合并,前提是你没有重新设置你正在收回SVN的分支。
只要您不重写该分支中的任何历史记录,就可以随意管理您的Git回购工作流程。

因此,最佳做法是尽可能减少与SVN回购协议同步的分支数量,以便于管理那些“公共”分支(对所有git用户和所有svn可见的“公共”分支用户)。

2

我有一个稍微不同的设置:SVN回购没有从Git回购克隆。

我的Git回购主要有两个分支:mastersvnmaster与远程裸Git回购同步,svn链接到远程SVN回购。

我使用git cherry-pick将提交从一侧应用到另一侧,并且在重新绑定和合并时没有问题。

我曾尝试将master合并到svn之前,但始终以无尽的冲突解决会话结束。当使用樱桃采摘时,生活会更容易。

要获得svn提交到我master,我做了以下内容:

首先,它们的上游得到同步两个分支:

git checkout svn 
git svn rebase 

git checkout master 
git pull 

然后(在master是):

gitk svn 

这将弹出gitk窗口,其中我选择要从svn传输的提交到master。然后,我使用git push将提交应用到我的远程。

要获取从mastersvn,I git checkout svn然后开始gitk master的更改。再次,我选择要传输的提交,完成后,git svn dcommit将提交推送到SVN服务器。

简单而无痛。

+0

听起来真的很有趣 - gitk的“运输工具”;-) 我会给这个机会! – Udo

+0

@Udo:你当然也可以使用命令行和'git cherry-pick',但是我发现GU​​I更方便。如果您使用的是TortoiseGit,您甚至可以一次选择多个提交选择。 – eckes