如何处理同时使用Git和Subversion时的Git-svn问题

7

[更新]

更多细节请参考:我为什么在家里尝试使用纯Git的原因是,我的公司想要转向Git,但经理不愿意做出改变,因为开发人员不熟悉我们自己存储库中的Git。所以,我尝试让每个人在学习阶段都使用纯Git,而有人可以在此期间合并回Subversion。因此,在任何紧急情况下,他们仍然可以使用Subversion。

因此,在每个人熟悉Git之前,我无法将存储库转移到使用纯Git。因此,它将同时更新Subversion和Git。(目前主存储库是Subversion)。因此,在我通过dcommit回到Subversion进行同步存储库的过程中,我试图使Git能够平稳工作。

[问题]

我所在的组织使用Subversion作为存储库,因此我将其导出为我的个人Git(并计划在未来使用Git替换Subversion)

现在,我有一个同时使用GitSubversion(主源)的存储库。当我必须同时使用git和subversion时,我遇到了处理git svn rebase的问题。

我的工作流程如下:

在办公室

  1. 存储库具有Git-svn接口
  2. 我总是使用git svn dcommit将代码提交到Subversion。
  3. 我将其推送到Bitbucket上的我的远程git存储库

在家里

  1. 我从Bitbucket克隆存储库
  2. 使用并提交到Bitbucket

现在,回到办公室

  1. git pull
  2. git svn rebase
  3. git svn dcommit
  4. git push

在步骤4中,我遇到了一个问题,因为我已经rebase了我的分支。

现在的问题在于,当我回到家时

当我回到家时,我无法使用'git fetch',因为该分支已经被rebase。所以,我必须使用git branch -D .....删除分支,然后再次git checkout

因此,我正在寻找一种方法,可以同时使用Git存储库和Subversion,并且在使用git svn rebasegit svn dcommit操作后,可以很好地使用Git。

注意。我不希望在家中使用任何git-svn。尽量向前迈进,只使用Git。

5个回答

2

好的,你在这里面遇到的主要问题似乎是无法从家中进行git pull,因为历史记录已被重写(实际上应该可以工作,但它会尝试做一个不必要的合并)。

解决这个问题最简单的方法是使用git pull --rebase。这样,你不是将你在家里做的提交与远程分支的最新提交合并,而是将自创建分支以来所做的每个提交都变基于该分支的最新提交。Git 足够聪明,可以看到某些提交完全相同,并且它们将在重新基础期间自动修剪。


我对 git pull --rebase 命令很感兴趣。如果我已经执行了 git svn dcommit 命令,那么它仍然能够工作吗?因为此后 sha1 发生了变化。 - scalopus
当你执行 pull --rebase 命令时,它会尝试将你的提交变基到远程分支的当前最新提交。所以是的,它可以工作。 - Colin Hebert

2
我猜你的问题主要原因是git svn dcommit会更改提交消息以包含SVN提交数据。由于消息包含在提交的SHA1中,因此这个更改对于git来说就像是完全不同的提交。
我的解决方案是在你的办公室仓库中有一个分支用于与SVN同步,另一个(纯git)分支用于做你的工作。每当你想要与SVN仓库交换内容时,你可以在其中一个方向上进行合并。
在我的情况下,我设置了另一个专门用于SVN交换的git仓库。我有一个cron job,每15分钟将该仓库与SVN服务器同步。这样我就不会错过git svn rebase

0

实际上,您应该能够使用git fetch,但是不要使用git merge origin/branch合并,而是可以使用git rebase origin/branch。这应该可以解决您的问题。

如果这没有帮助,请尝试git fetch,然后git checkout -f -B branch origin/branch,最后一条命令将强制从远程分支覆盖本地分支。


0

您没有提及为什么要一直使用svn。但是我的建议是,彻底开始使用一个干净的git库,并避免不必要的问题。

我认为Casey在迁移到git方面提供了最好的答案: 如何将带有历史记录的SVN存储库迁移到新的Git存储库?

当然,您需要备份然后开始这个过程。

另一个想法是,如果rebase是问题所在,为什么不使用纯svn update,然后像自己编写的一样将更改提交给Git(仅通过git commit)。


MacroA,如果是我自己的代码库,一切都很容易管理。但是当你在一个大型开发团队的公司工作时,你所需要做的就变得困难了。仍然有很多依赖于这些部署系统的存在。除非一切准备就绪,否则某些事情是不能中断的,包括迁移工作。 - scalopus

0

使用Git进行版本控制书籍的第295页找到了解决方案。

不要使用本地的master分支,而是要检出远程分支。

git checkout remote/master (Detach HEAD)
git merge --no-ff master (merge the local master)
git svn dcommit
git push origin (update to git Repository)

这个模型适用于一个人将合并回Subversion存储库,而另一个人则在纯Git或纯Subversion上工作。通过这种方式,Git用户可以使用Git而不会出现合并问题。


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