git svn fetch为分支多次检索相同的Subversion修订版

时间:2009-07-16 21:29:46

标签: git git-svn

我看到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 没有检索它已经拉过的修订版?

4 个答案:

答案 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正在举手并且只是取出所有历史记录以找出答案。 (这种方法仍然需要对每个位置进行完全提取,但这比每个标记的完整历史记录提取要快得多)