git-svn树的git clone?

时间:2009-02-20 19:39:22

标签: svn git workflow git-svn

我有一个'git-svn'工作树。我想克隆一个“纯”的git repo,然后使用git push / pull在git-svn树和git树之间移动更改,同时还使用'git svn dcommit / rebase'来移动git-svn树和它所基于的SVN repo。

这似乎可以正常使用git方法在git树之间来回移动东西,但是当我在git-svn树中与SVN repo交互时,事情变得很糟糕 - 我得到错误当在git树之间推或拉时,或者我在git-svn树中丢失了提交,或者其他奇怪的事情。

这种类型的SVN< - > git-svn< - >完全支持git工作流程,还是应该退出这棵树?

6 个答案:

答案 0 :(得分:9)

我为我的一些项目设置了桥接器,但它只是从git到svn的单向路径(提供我们的git master分支的公共只读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的这两篇文章也可能有所帮助:

答案 1 :(得分:9)

可能导致您麻烦的一件事是git svn dcommit将重写它发送给SVN的所有提交 - 至少如果它被配置为将SVN元数据注释添加到提交消息的底部。所以你必须采用一个流程,任何从你的git-svn工作区提交的存储库都会对它进行反对,丢失所有无法存储在SVN中的合并历史记录。

答案 2 :(得分:5)

基于我所看到的,git-svn不支持此工作流,并且由于SVN表示合并的方式,因此不会支持此工作流。

答案 3 :(得分:3)

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

  git-svn就像一辆飞行汽车。每个人都想要一辆飞行汽车,直到他们意识到飞行汽车非常糟糕,无论是汽车还是飞机。

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

答案 4 :(得分:2)

如果您能够在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 commitgit push触发的挂钩。这样SubGit就可以转换任何传入的修改。

另请参阅与git-svn的比较。

答案 5 :(得分:1)

使用git和git-svn 1.7.1,似乎我刚做的测试似乎工作正常。

git svn init [url]
git svn fetch

然后你必须创建并签出一个虚拟分支才能推送到主分支。

git checkout -b dummy

然后你可以将它(git clone ...)克隆到另一个纯git repo中,修改它,提交它(git commit)然后将(git push)推入git-svn repo。 / p>

回到git svn repo:

git checkout master
git svn dcommit

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