有没有办法“持久”同步git存储库与SVN?

时间:2011-03-20 13:37:46

标签: svn git git-svn

从我在网络上找到的内容来看,似乎使用git svn并非“持久”。

意思是,如果我git svn clone是一个存储库,那么推送到一个单独的文件夹中掌握并重新发送一个新副本,新副本根本不知道svn,并且不能在不重新应用的情况下与SVN同步svn clone

有没有解决这个问题的方法?

3 个答案:

答案 0 :(得分:5)

克隆基本上只是初始化一个新的git存储库,设置origin远程,运行git fetch,并根据远程存储库的HEAD创建一个分支。这些操作都不会查看远程存储库中的.git/svn信息 - 我认为除远程存储库的git目录中的refsobjectsHEAD之外的所有内容都被视为私有的。

至于解决这个问题的方法,您可以始终rsync -ascp -r远程存储库而不是克隆它(这应该有效) - 应该复制所有Subversion元数据。

然而,就我个人而言,我总是发现只有一个git svn克隆的存储库可以git svn dcommit来解决这个问题,并且只要我想向Subversion提交任何内容,就会回到该存储库。然后那些其他存储库只是普通的git存储库,你不需要担心git svn的任何限制,直到你回到git svn克隆,此时你通常需要做一些垫底...

答案 1 :(得分:1)

我发现最简单的方法是使用与创建第一个git-svn克隆相同的参数git svn init克隆,然后是update-ref和dcommit。

说你做了:

  

git svn clone -s svn:// server / website

..创建第一个回购。然后你会克隆它:

git clone website website2
cd website2 

初始化git-svn:

git svn init -s svn://server/website

现在你必须更新git-svn远程引用以指向最后一次提交,例如:

  

git update-ref refs / remotes / trunk refs / remotes / origin / HEAD

然后只需执行一个git svn dcommit来重建git-svn revmap。

  

git svn dcommit

你应该看到这样的输出:

git svn dcommit
Rebuilding .git/svn/refs/remotes/trunk/.rev_map.dbae88...
r1 = a9cf429caa11ba5433a6526c2d327de6db2605d1
r2 = 2811ffb78c0a9e0a74208758367044710c1c0159
r4 = 1b787f296aeb98806875ca4f2bde67131720cd57
r9 = 991400ef398fad17ca14253467997d4764561cff
r11 = c5984281dd185d3dbb3bf3fa26f168f34d4e4b53
r13 = aa7678d2f9b5f87152ab09a59ea11a4643e84b6c
r14 = 1c91c959e3bbd2d41dd001a670d01abef29ae1ad
Done rebuilding .git/svn/refs/remotes/trunk/.rev_map.dbae88...
Committing to svn://server/website/trunk ...

有关更多背景信息,请查看this post,尤其是第5点。

答案 2 :(得分:0)

GIT-SVN SNIPPETS:http://marcocattai.posterous.com/git-svn-snippets

我希望它们有用。