Git与SVN主干和分支机构

时间:2013-01-29 09:26:37

标签: git svn merge branch git-svn

由于我一直在使用Git,我喜欢你可以创建一个本地分支,你可以压缩到你的主分支和DCommit到SVN(在主干上),然后删除那个本地分支(在Git上)。

现在我想了解如何处理SVN分支。我需要与团队合作开发新功能,但我们不想在Trunk上这样做。很明显,我们需要从主干分支并在该分支上工作,直到我们对工作感到满意并合并回Trunk。

关于如何从Git前端角度进行操作的任何想法? 我确信那里有足够的资源,但我没有找到能够解释这一点的东西。

所以,为了确保我自己解释,我知道如何单独使用Git和SVN中继。这很容易也很好。但是我需要从trunk上分支SVN并使用Gi​​t在该分支上工作(希望仍然可以使用Git访问SVN中继),直到工作完成,然后将该分支合并回SVN上的trunk(再次使用Git)。如果有人能让我对此有所了解,我将非常感激!是否有可能在一个Git仓库中拥有它?

提前致谢。 (如果还不清楚请告诉我。)

2 个答案:

答案 0 :(得分:3)

几个月前我在博客上发表了这个话题:http://www.jillesvangurp.com/2012/08/04/git-presentation/

简而言之,您可以在单个git存储库中跟踪多个svn分支,但实际上您不应该这样做。有一次搞砸了我基本上再也不会尝试在一个存储库中跟踪多个svn分支。它太易挥发,太容易在svn中造成严重损坏。基本上一切都在当地很好,我提出了我的改变。但实际上我重新排序了一些真正不应该重新排序并在上游造成很多损害的提交。最后我不得不做一个大的svn还原。非常尴尬。

因此,使用单独的git存储库来跟踪每个svn分支,并将这些存储库用作仅在git存储库上的远程存储库,在该存储库中,您实际上可以随时推送到不同的远程存储库。像这样隔离git和svn很有意义。确保你的历史保持线性(svn不是非线性的),并确保始终对上游进行折旧。

在这种情况下,在分支/存储库之间移动提交的更安全的方法(在git世界中同样的事情)是使用git format-patch和git am。或者,您可以在存储库中使用git cherry-pick。

答案 1 :(得分:1)

我终于发现了使用Git处理SVN分支所需要做的事情。 我已经尝试了下面提到的东西(除了我指定的地方)所以我相当自信,只要我不做任何有趣或不合适的事情,我从Git到SVN的提交应该工作得很好。 但当然我对可能发生的任何问题不承担任何责任!我愿意接受进一步的评论/评论。

即使我没有使用标准布局克隆SVN repo,我也应该配置指向subversion上相关SVN路径的遥控器。

克隆SVN分支(SVN路径应指向包含主干,分支和标记的根路径):

git svn clone -s http://myrepo.com c:/my/local/path

如果您已经拥有SVN分支的克隆,则需要手动将遥控器添加到其他SVN分支,请检查以下内容:

重要的是你有一个跟踪远程分支的本地分支。

git checkout -b localbranch remotes/remote_branch

现在你可以针对那个本地分支进行提交,每次完成时就像在trunk中一样:

git svn fetch
git svn dcommit

当你最终完成SVN分支并且想要合并到trunk时,你可以执行以下操作(它从该分支获取所有内容并将其重新绑定为master):

git checkout master
git merge localbranch
git rebase -i trunk  (just save the message)
git svn fetch
git svn dcommit

如果您愿意,也可以直接进行壁球合并(如果您不想带来所有这些小签到):

git merge --squash localbranch
git svn fetch
git svn dcommit

在进行真正的DCOMMIT之前,您可能正在进行干运行,以确保一切正常(包括目的地)。

git svn dcommit -dry-run

但是,如果您预计合并冲突(这是我在网上看到的,但我还没有尝试过,我只是提到它)在上面显示的git checkout master行之前执行以下操作。这是一个本地分支,它不跟踪应该用于解决合并冲突和内容的远程分支。这是否有必要是另一回事。

git checkout -b merge_work master
git merge localbranch
git checkout master
git rebase merge_work

我正在为自己和其他可能希望将来尝试这一点的人写下来。