当必须同时使用Git和Subversion时如何处理Git-svn

时间:2012-04-12 02:15:56

标签: git svn git-svn

[更新]

有关详细信息,我尝试在家中使用纯Git的原因是,我的公司希望转移到Git,但是经理不愿意做出更改,因为开发人员对我们的Git不了解自己的存储库所以,我尝试做的是,我试图让每个人都使用Pure git,而有人可以在这个学习阶段合并回Subversion。因此,在任何紧急情况下,他们仍然可以使用Subversion。

所以,在每个人都熟悉Git之前,我无法转移存储库以使用纯Git。因此,它将同时更新Subversion和Git。 (现在主存储库是Subversion)。因此,我尝试通过dcommit将存储库同步回Subversion,让Git可以顺利运行。

[问题]

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

现在,我的存储库同时使用 Git Subversion(主要来源)。当我必须同时使用git和subversion时,我有一个问题需要处理 git svn rebase

我的工作流程如下所示

在办公室

  
      
  1. 存储库具有Git-svn接口
  2.   
  3. 我总是从这里用 git svn dcommit 将代码提交给Subversion。
  4.   
  5. 我推送到Bitbucket的远程git存储库
  6.   

在家

  
      
  1. 我从Bitbucket克隆存储库
  2.   
  3. 使用并承诺使用Bitbucket
  4.   

现在,回到OFfice

  
      
  1. git pull
  2.   
  3. git svn rebase
  4.   
  5. git svn dcommit
  6.   
  7. git push
  8.   

在第4步中,我遇到了一个问题,即我已经重新设定了我的分支

现在问题出现在我回家的时候

当我回到家时,我不能使用'git fetch',因为分支已经重新定位。所以,我必须用 git branch -D ..... 删除分支,然后再次 git checkout

因此,我寻找可以同时使用Git存储库和Subversion的方式,并在使用 git svn rebase git svn dcommit

请注意。我不想在家里使用任何 git-svn 。尝试继续使用Git。

5 个答案:

答案 0 :(得分:2)

好吧,你在这里的主要问题似乎是你不能真正从家里做git pull历史已被重写(实际上它应该可以工作,但它会尝试进行不必要的合并)。< / p>

解决该问题的最简单方法是使用git pull --rebase。这样,您不必将您在家中提交的提交与远程分支的提示合并,而是重新设置自分支创建分支创建以来所做的每个提交。 Git会非常聪明地看到一些提交完全相同,并且它们会在rebase期间自动修剪。

答案 1 :(得分:1)

我认为问题的主要原因是git svn dcommit更改了提交消息以包含SVN提交数据。由于消息包含在提交的SHA1中,因此这个更改似乎是一个完全不同的提交。

我的解决方案是在你的办公室仓库中有一个分支,你与SVN和另一个(纯粹的git)分支同步来完成你的工作。每当你想与SVN仓库交换一些东西时,你做一个合并一个或另一个方向。

就我而言,我已经设立了另一个专门用于SVN交换的git仓库。我有一个cron作业,它每15分钟与SVN服务器同步一次repo。这样我就不会错过git svn rebase

答案 2 :(得分:0)

你没有提到你为什么要保留svn。但我的建议是从一个干净的git repo开始,一劳永逸。并避免不必要的问题。

我相信Casey在迁移到git时做出了最佳答案: How to migrate SVN repository with history to a new Git repository?

当然,您必须进行备份,然后开始此过程。

另一个想法是,如果rebase是问题,为什么不使用纯svn更新,然后将更改提交给Git(仅限git commit),就像你自己编写它一样。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

Version Control with Git书中找到解决方案。第295页。

而不是使用本地 - 主分支,必须结帐远程分支

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 OR纯Subversion。通过这种方式,Git用户可以使用Git而不会出现合并问题。