代码之家  ›  专栏  ›  技术社区  ›  genehack

git克隆git svn树?

  •  17
  • genehack  · 技术社区  · 17 年前

    就使用git方法在git树之间来回移动东西而言,这似乎是可行的,但一旦我与git SVN树中的SVN仓库交互,事情就会变得不稳定——要么我在git树间推或拉时出错,要么我在git-SVN树中丢失了提交,要么其他异常。

    这种SVN<->git svn<->完全支持git工作流,还是我应该停止构建这棵树?

    6 回复  |  直到 17 年前
        1
  •  9
  •   araqnid    16 年前

    我为我的一些项目设置了一个桥接器,但它只是从git到svn的单向连接(提供我们git主分支的公共只读svn镜像)。然而,由于它工作良好,它可能会在双向场景中帮助你或为你指明正确的方向,因为我假设它是git->制造问题的svn,而不是svn->git:

    我的单向场景:github上的现有git存储库,需要git master分支的只读svn镜像

    • 在服务器上创建并初始化目标subversion存储库:

      svnadmin create svnrepo
      mkdir trunk
      svn import trunk svn://yoursvnserver/svnrepo
      rmdir -rf trunk
      
    • 创建混合Git Svn签出并初始化subversion存储库

      git svn clone svn://yoursvnserver/svnrepo/trunk
      cd trunk
      git remote add github git://github.com/yourname/repo.git
      git fetch github
      git branch tmp $(cat .git/refs/remotes/github/master)
      git tag -a -m "Last fetch" last tmp
      INIT_COMMIT=$(git log tmp --pretty=format:%H | tail -1)
      git checkout $INIT_COMMIT .
      git commit -C $INIT_COMMIT
      git rebase master tmp
      git branch -M tmp master
      git svn dcommit --rmdir --find-copies-harder
      
    • 更新镜像

      git fetch github
      git branch tmp $(cat .git/refs/remotes/github/master)
      git tag -a -m "Last fetch" newlast tmp
      git rebase --onto master last tmp
      git branch -M tmp master
      git svn dcommit --rmdir --find-copies-harder
      mv .git/refs/tags/newlast .git/refs/tags/last
      

    googlecode的这两篇文章也可能有所帮助:

        2
  •  9
  •   Fabian N.    10 年前

    可能给你带来麻烦的一件事是 git svn dcommit 将重写它发送给SVN的所有提交——至少如果它被配置为将SVN元数据注释添加到提交消息的底部。因此,您将不得不采用一种流程,在该流程中,任何从git svn工作区获取提交的存储库都会根据它重新建立基础,从而丢失所有无论如何都无法存储在svn中的合并历史记录。

        3
  •  5
  •   genehack    16 年前

    根据我所看到的,由于svn表示合并的方式,git svn不支持此工作流,将来也不会支持。

        4
  •  3
  •   Randal Schwartz    16 年前

    正如我在#git上经常说的:

    git svn就像一辆会飞的汽车。每个人都想要一辆飞行汽车,直到他们意识到飞行汽车和汽车或飞机一样糟糕。

    真正的解决方案是尽快完全摆脱SVN。使用git svn进行一次性迁移,然后移动所有人。Git是 很难学。

        5
  •  2
  •   vadishev    13 年前

    如果您能够将自定义挂钩安装到Subversion存储库中,请考虑使用 SubGit .

    SubGit是一个服务器端解决方案,可以自动同步SVN和Git存储库。要安装SubGit,请执行以下操作:

        $ subgit configure $SVN_REPOS
        $ # Adjust $SVN_REPOS/conf/subgit.conf 
        $ #     to specify your branches and tags
        $ # Adjust $SVN_REPOS/conf/authors.txt 
        $ #     to introduce svn author names to their git counterparts
        $ subgit install $SVN_REPOS
        $ ...
        $ INSTALLATION SUCCESSFUL
    

    目前,SubGit已经安装了钩子,这些钩子由每个 svn commit git push 。这样,SubGit会转换任何传入的修改。

    另请参见与 git-svn .

        6
  •  1
  •   simont basooli    14 年前

    使用git和git svn 1.7.1,我刚才做的测试似乎工作得很好。

    git svn init [url]
    git svn fetch
    

    然后,您必须创建并签出一个虚拟分支,以便能够推送到主分支。

    git checkout -b dummy
    

    然后你可以克隆它( git clone ... )进入另一个纯git仓库,修改它,提交它( git commit )然后推( git push )进入git svn仓库。

    回到git svn仓库:

    git checkout master
    git svn dcommit
    

    将提交所有已推送的git提交。