从SVN迁移到Git - 用“@”复制标签?

时间:2015-06-04 20:38:42

标签: git svn tortoisesvn git-svn tortoisegit

我正在尝试从SVN到Git的单向迁移。虽然我的大多数回购都很好,但每隔一段时间我就会得到一个给定SVN标签的“重复”参考,我不知道为什么。

举个例子,这是SVN repo的/ tags目录的快照,用TortoiseSVN的Repo Browser显示。注意标记“657_RemoveTravellogProgressbar”:

SVN repo

迁移到Git后,如果我查看.git / packed-refs的内容,浩大的大多数标签会按预期出现 - 每个标签一个条目。奇怪的是,这个“657”标签(和另外一个)产生了多个条目,其中一些跟着一个@-数字:

07d524b93e8fc6957d06f687f83db0ba897890a9 refs/remotes/tags/657_RemoveTravellogProgressbar
ee48ab8efa3f4ed5f54d0d1a3dd8fac76205ab9e refs/remotes/tags/657_RemoveTravellogProgressbar@327
23eccb461e341a2f7bd0af03159c61600c888e7c refs/remotes/tags/657_RemoveTravellogProgressbar@657

为了将我的远程SVN标签/分支转换为迁移的repo中的真实Git标签/分支,我使用以下命令(来自this方便教程):

git branch -r | sed -rne 's, *tags/([^@]+)$,\1,p' | while read tag; do echo "git tag $tag 'tags/${tag}^'; git branch -r -d tags/$tag"; done | sh
git branch -r | grep -v tags | sed -rne 's, *([^@]+)$,\1,p' | while read branch; do echo "git branch $branch $branch"; done | sh

运行命令后,我将迁移的Git仓库推送到一个裸仓库。再次克隆它(删除SVN引用)。如果我然后使用TortoiseGit查看其修订图,一切都如预期的那样...除了那个奇怪的657标签(以及另外一个)之外:

Git Revision Graph

所以问题是:是什么导致这两个标签(数十个)以这种方式迁移 - 他们最终在Git中有多个引用 - 而99%的标签出来就好了?什么是避免它的正确方法(实现'一致'修订图)?请注意,标记/分支转换命令在名称中显式查找“@”;很明显,文章的作者知道这可能会发生......但我无法弄清楚原因。

〜补遗〜

查看我的源SVN repo的修订图,未显示657标记:

SVN Revision Graph

如果我查看从657标记开始的提交日志,它只返回少数提交(vs从任何其他标记开始显示历史记录回到开始时间,如预期的那样)。所以看起来有些事情与源SVN回购有关 - 虽然我再也不知道为什么/为什么 - 或者为什么这会在Git中产生多个657?

1 个答案:

答案 0 :(得分:0)

您是否注意到每个标签有3个不同的SHA1代码,如下所示: 07d524b93e8fc6957d06f687f83db0ba897890a9 refs / remotes / tags / 657_RemoveTravellogProgressbar ee48ab8efa3f4ed5f54d0d1a3dd8fac76205ab9e refs / remotes / tags / 657_RemoveTravellogProgressbar @ 327 23eccb461e341a2f7bd0af03159c61600c888e7c refs / remotes / tags / 657_RemoveTravellogProgressbar @ 657

使用以下内容获取SHA1的详细信息:(您可能会找到答案)

git cat-file -p 23eccb461e341a2f7bd0af03159c61600c888e7c

git cat-file -p ee48ab8efa3f4ed5f54d0d1a3dd8fac76205ab9e

相关问题