git-svn和一个远程git repo同步

时间:2010-09-02 00:38:14

标签: svn git workflow git-svn

在我的工作场所,我们使用SVN进行版本控制。当我发现它时,我切换到git-svn,最近我决定将我的一些私有分支同步到另一个远程git仓库。然后,工作流程包括通过git-svn重新定位和推送到SVN仓库,同时处理推送到远程git仓库的单独的私有功能分支,以便我可以在必要时在家中处理它们。

现在,每次我从git-svn转发时,我的远程git repo要求先被拉。有时候,在进行拉取时,更改不会干净地合并,即使据推测,远程仓库应该包含与svn同步的本地提交的相同提交。最近我再次将它们推到远程仓库之前删除远程分支,但这不可能是正确的。

是不是为这种工作流程设置了git,还是我做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:6)

首先,感谢Matthew的链接 - 他们帮我解决了这个问题。

可以这样做,但需要注意的是它需要一些小心,并且很可能对涉及的提交者数量有限制。我的用例基本上是mitjak所描述的;需要和/或希望使用两个远程存储库,一个SVN和另一个Git的单个用户。在我的情况下,前者在防火墙后面工作,另一个在异地(也是私人)。目标是能够使用Git处理存储库的本地副本,并使两个远程存储库都满意。

我的程序:

这一切都取决于git svn dcommit更改与原始git提交相关联的SHA1的事实。牢记这一点,在本地提交后,我[[{1}}然后] git svn rebase生成最终的SHA1。那时,我推到我的远程git仓库。如果Chacon声明你要做的就是使用git提供更有效的克隆点,那么你就完成了。但您可能也希望能够:

  1. 从另一个本地“pure git”存储库推送到远程git存储库,然后是
  2. 同步混合git / svn存储库,然后
  3. 将这些更改推送到SVN存储库。
  4. 步骤1表示没问题;在将本地“pure git”存储库git svn dcommit提交到远程git存储库之后。

    第2步再次没问题;回到你的混合git / svn存储库,git push来自远程git存储库的更改。此时,与新提取的修订版关联的SHA1与远程git存储库中的版本保持同步。

    第3步是进程变得有点棘手的地方。您可以git pull如上所述将这些更改推送到SVN存储库,但是情况与上述情况略有不同。在这种情况下,您现在在远程SVN和git存储库中具有相同的修订版,但由于dcommit,它们具有不同的SHA1。我通过以下方式处理:

    在第2步的拉动期间,我注意到相关的开始SHA1;如,

      
      git pull
      someone@example.org's password: 
      remote: Counting objects: 5, done.
      remote: Compressing objects: 100% (3/3), done.
      remote: Total 3 (delta 0), reused 0 (delta 0)
      Unpacking objects: 100% (3/3), done.
      From ssh://example.org/pub/scm/demonstrate
        34b6260..17cd887  master     -> origin/master
      Updating 34b6260..17cd887
      Fast forward
        file3 |    2 +-
        1 files changed, 1 insertions(+), 1 deletions(-)
    

    所以这里感兴趣的SHA1是34b6260。 git svn dcommit应该确认这是远程git存储库中的最后一次提交,它具有与之关联的git-svn-id。然后我做以下事情:

    git push -f origin 34b6260:master
    

    执行远程存储库的强制更新,以排除我从“纯git”本地存储库中提取的“纯git”提交 - 小心使用!在这种情况下,我知道我在本地提交了这些提交;他们只是从dcommit有不同的SHA1。然后我git log origin到远程存储库,添加我刚删除的提交的“git-svn-id” - 转换,并且远程存储库是同步的。

    将“纯git”本地存储库与远程git存储库重新同步是最后一步,但类似的关注会产生令人满意的结果。在这种情况下,远程git存储库现在包含提交的“git-svn-id” - 转换,而本地“pure git”存储库仍包含原始SHA1。处理此问题的最简单方法是从远程git存储库git push,然后git fetch强制本地git存储库镜像远程状态。

答案 1 :(得分:4)

chapter 9.1 of Pro Git中,Scott Chacon说:

  

不要重写您的历史记录并尝试再次推送,也不要推送到并行Git存储库以同时与其他Git开发人员协作。 Subversion只能有一个线性历史记录,而且容易混淆。如果您正在与团队合作,而有些人正在使用SVN而其他人正在使用Git,请确保每个人都使用SVN服务器进行协作 - 这样做会让您的生活更轻松。

基于陈述:

  1. “不要推送到并行Git存储库”和
  2. “Subversion只能有一个线性历史”,
  3. 似乎Subversion无法从远程git repo中提取所需的工作流程,因此Subversion只有一个线性历史记录。

    更新时间01-Sep-10,8:37 PM

    您可能需要查看Daya Bay文章同步存储库中的Advanced: Linking another, remote GIT repository to your GIT and GIT-SVN部分。

答案 2 :(得分:0)

也许this thread可能会引起人们的兴趣,尽管git-svn可能已经改变了。

我还使用fetch而不是pull,并快速查看在执行合并之前是否会使用gitk之类的工具发生冲突。

相关问题