36

当 git svn fetch 在我的 Subversion 存储库中找到分支时,我看到它反复检索相同的 Subversion 修订。我们使用标准的 Subversion 存储库布局,具有顶级 /trunk、/tags 和 /branches 目录(并且 git 存储库是使用 'git svn init -s' 创建的)。但是,有问题的分支通常是从主干内的子目录而不是主干创建的副本。

git svn fetch 输出通常如下所示:

r2537 = d5b22e956157af036d4112e42e8fb927e45758c8(主干)
        M Enterprise/VC/libgc/SymbolVenue.cpp
r2538 = cfed4ca0491da0b732f32bfff72ba678450a0915(主干)
找到可能的分支点:http://repo/prod_repos/trunk/Enterprise/VC => http://repo/prod_repos/branches/file_conversion, 2523
W:Refspec glob 冲突(参考:refs/remotes/scripter@832):
预期路径:branchs/scripter@832
    真实路径:trunk/Enterprise/Python
继续使用主干/企业/Python
W:Refspec glob 冲突(参考:refs/remotes/trunk):
预期路径:分支/主干
    真实路径:trunk
继续使用后备箱
初始化父级:file_conversion@2523
        一个 gc/QuoteService.cpp
        一个 gc/TestSuite.h
        一个 gc/quote_svc.pro
        一个 gc/QuoteService.h
......

r1 = d349ed8cb2d76596fe2b83224986275be4600fad (QuoteSvcFix442@2698)
        D gc/FixMessageLogger.h
......
r5 =
r19 =
r20 =
......

我们回到修订版 1。 git svn fetch 然后继续获取修订版,直到它到达创建分支的修订版。

我究竟做错了什么?无论如何我要告诉 git svn fetch 不要检索它已经提取的修订版?

4

4 回答 4

72

我注意到了这个问题,因为我收到了相同的错误消息:

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 首先复制此信息。我杀死并继续最初的克隆,这可能是相关的?

于 2009-12-13T09:59:25.707 回答
10

删除重复项仍然给我带来了问题。每次重新运行克隆命令时,例如git svn clone svn://.../svnroot --no-metadata -A authors-transform.txt --stdlayout 。它在 .git/config 中增加了两行。我不得不删除所有包含分支 = 分支/ :refs/remotes/标签 = 标签/ :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
~
于 2012-01-05T05:35:46.883 回答
4

如果在任何时候,您的存储库的主干存在于 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 正在举手并只是获取所有历史记录以找出答案。(这种方法仍然需要对每个位置进行完整提取,但这比对每个标签的完整历史提取要快得多)

于 2015-11-13T16:32:52.940 回答
3

git-svn 似乎在重复提取相同的修订版本,因为您的 SVN 存储库中有标签。SVN 的标签概念与 git 略有不同:SVN 标签实际上是分支(因此SVN 标签是副本)。

仔细看看你的输出:

r1 = d349ed8cb2d76596fe2b83224986275be4600fad (QuoteSvcFix442@2698)

尽管修订r1 =看起来太熟悉了,但其余的文本可能有所不同。至少,标签名称(在本例中QuoteSvcFix442@2698为 )不会相同。

我认为防止这种情况的唯一方法是让 git-svn 跳过 SVN 标签。如果你不能没有标签,你也可以将 SVN 'tag' 分支转换为真正的 git 标签(但你必须首先获取所有标签分支!)


一个相关的 SO 问题以及可能的解决方法:Git-svn 可以用于大型分支存储库吗?

关于这个问题的一些讨论:git-svn --tags 应该至少 /try/ 将标签处理为 tags

于 2011-07-26T06:12:51.757 回答