有没有一种“持久性”的方法将Git仓库与SVN同步?

6

根据我在网上找到的资料,似乎使用git svn不是“持久化”的。

也就是说,如果我git svn clone一个仓库,然后推送到主分支并在另一个文件夹中重新拉取一个新的副本,那么这个新的副本完全不知道svn,并且不能用于与SVN同步,除非重新应用svn clone

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


1
Thomas Ferris Nicolaisen写了一系列关于您的环境的文章。http://www.tfnico.com/presentations/git-and-subversion - Rudi
3个回答

5
克隆实际上只是初始化一个新的git仓库,设置“origin”远程,运行“git fetch”,并基于远程仓库的“HEAD”创建一个分支。这些操作都不会查看远程仓库中的“.git/svn”信息 - 我认为除了“refs”、“objects”和“HEAD”之外,远程仓库的git目录中的所有内容都被视为私有。
至于解决方法,您可以始终使用“rsync -a”或“scp -r”而不是克隆远程仓库,这应该可以解决问题 - 所有Subversion元数据都应该被复制。
然而,就个人而言,我总是发现只有一个“git svn”克隆仓库更容易理解,我从那里进行“git svn dcommit”,每当我想提交任何东西到Subversion时,就将其推回到该仓库。然后,那些其他仓库就只是普通的git仓库,您不需要担心任何“git svn”的限制,直到您将其推回到“git svn”克隆仓库,此时通常需要做一些变基...

1

我发现最简单的方法是使用相同的参数用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 ...

如需更多背景信息,请查看此帖子,特别是第5点。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接