17

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

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

是否完全支持这种类型的 SVN <-> git-svn <-> git 工作流,还是我应该停止吠叫这棵树?

4

6 回答 6

10

我为我的一些项目设置了一个桥接器,但它只是从 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 的这两篇文章也可能有所帮助:

于 2009-02-20T20:20:49.153 回答
9

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

于 2010-02-15T23:41:43.153 回答
5

根据我所见,由于 SVN 表示合并的方式,git-svn 不支持此工作流程,并且不会支持。

于 2010-02-15T23:29:39.653 回答
3

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

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

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

于 2010-02-15T23:37:17.657 回答
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 已经安装了由 everysvn commit和触发的钩子git push。这样 SubGit 会转换任何传入的修改。

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

于 2012-07-16T14:26:07.363 回答
1

使用 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 提交。

于 2011-08-20T07:09:29.223 回答