我看到git svn fetch重复检索相同的Subversion 在我的Subversion存储库中找到分支时的修订。我们是 使用标准的Subversion存储库布局,顶级 / trunk,/ tags和/ branches目录(和git存储库是 用'git svn init -s'创建)。但是,有问题的分支是 通常是从trunk中的子目录中制作的副本,而不是 中继线。
git svn fetch输出通常看起来像这样:
r2537 = d5b22e956157af036d4112e42e8fb927e45758c8 (trunk) M Enterprise/VC/libgc/SymbolVenue.cpp r2538 = cfed4ca0491da0b732f32bfff72ba678450a0915 (trunk) Found possible branch point: http://repo/prod_repos/trunk/Enterprise/VC => http://repo/prod_repos/branches/file_conversion, 2523 W: Refspec glob conflict (ref: refs/remotes/scripter@832): expected path: branches/scripter@832 real path: trunk/Enterprise/Python Continuing ahead with trunk/Enterprise/Python W: Refspec glob conflict (ref: refs/remotes/trunk): expected path: branches/trunk real path: trunk Continuing ahead with trunk Initializing parent: file_conversion@2523 A gc/QuoteService.cpp A gc/TestSuite.h A gc/quote_svc.pro A gc/QuoteService.h ..... r1 = d349ed8cb2d76596fe2b83224986275be4600fad (QuoteSvcFix442@2698) D gc/FixMessageLogger.h ..... r5 = r19 = r20 = .....
然后我们回到修订版1. git svn fetch然后 继续获取修订版,直到达到修订版 创建了分支。
我做错了什么?无论如何,我告诉git svn fetch to 没有检索它已经拉过的修订版?
答案 0 :(得分:65)
我注意到了这个问题,因为我收到了同样的错误消息:
W: Refspec glob conflict (ref: refs/remotes/trunk):
expected path: branches/trunk
real path: trunk
原来,.git / config有重复的行似乎混淆了git-svn,如下所示:
[svn-remote "svn"]
...
branches = project/branches/*:refs/remotes/*
tags = project/tags/*:refs/remotes/tags/*
branches = project/branches/*:refs/remotes/*
tags = project/tags/*:refs/remotes/tags/*
删除那些重复项为我解决了奇怪的git-svn行为,也许对你来说也是如此。我不确定是什么原因导致git-svn首先复制这些信息。我杀了并继续了最初的克隆,这可能是相关的吗?
答案 1 :(得分:10)
删除重复项仍然给我带来了问题。每次重新运行克隆命令,例如 git svn clone svn://.../svnroot --no-metadata -A authors-transform.txt --stdlayout。它为.git / config增加了两行。 我必须删除所有包含 branches = branches / 的行:refs / remotes / 和 tags = tags / :refs / remotes / tags / 强>
保留配置如下所示:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[svn-remote "svn"]
noMetadata = 1
url = svn://.../svnroot
fetch = trunk:refs/remotes/trunk
[svn]
authorsfile = /home/users/denn/authors-transform.txt
~
答案 2 :(得分:3)
git-svn似乎反复提取相同的修订,因为您的SVN存储库中有标记。 SVN的标记概念与git的略有不同:SVN tags are actually branches(因此{{ 3}})。
仔细看看你的输出:
r1 = d349ed8cb2d76596fe2b83224986275be4600fad (QuoteSvcFix442@2698)
尽管修订版r1 =
看起来太熟悉了,但其余文本可能有所不同。标签名称(在本例中为QuoteSvcFix442@2698
)至少不一样。
我认为防止这种情况的唯一方法是让git-svn跳过SVN标签。如果你不能没有标签,你也可以SVN tags are copies(但是你必须首先获取所有标记分支!)
可能的解决方案相关的SO问题:convert the SVN 'tag' branches to real git tags
关于此问题的一些讨论:Can Git-svn be used on large, branched repositories?。
答案 3 :(得分:3)
如果存储库的主干在任何时候存在于SVN中的其他位置,请尝试指定此位置以另外获取存储库的配置文件。例如:
[svn-remote "svn"]
...
fetch = project/trunk:refs/remotes/origin/trunk
fetch = previous/location/of/trunk:refs/remotes/origin/trunk-old1
fetch = another/location/of/trunk:refs/remotes/origin/trunk-old2
...
对于我导入的项目,有许多分支和标记是从这些以前的位置创建的。由于这些是从“未知”的地方创建的分支/标签,git svn正在举手并且只是取出所有历史记录以找出答案。 (这种方法仍然需要对每个位置进行完全提取,但这比每个标记的完整历史记录提取要快得多)