【问题标题】:git svn fetch retrieves the same Subversion revision multiple times for branchesgit svn fetch 为分支多次检索相同的 Subversion 修订
【发布时间】:2009-07-16 21:29:45
【问题描述】:

我看到 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 不检索它已经提取的修订?

【问题讨论】:

  • 好问题 (+1)。这也发生在我身上,似乎是在浪费我的时间。
  • 怪 SVN,它将分支本质上存储为存储库的副本;-) David Wheeler 在dwheeler.com/essays/scm.html 提供了一些历史和内部工作原理@

标签: git git-svn


【解决方案1】:

我注意到这个问题是因为我收到了同样的错误信息:

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

【讨论】:

  • 我也有这个问题。而且我还杀死了最初的克隆并重新启动。看起来可能是原因......
  • 嗯。我的 .git/config 中有相同的重复列表,但即使在停止、删除重复项并重新启动之后,问题仍然存在。 :(
  • 至少在我的情况下,问题不是 svn-remote 中的重复条目。这个问题对于 git-svn 架构来说更重要一些。简而言之,git svn 不跟踪目录或文件重命名,这意味着它必须重新获取历史记录。 git svn 作者 Eric Wong 有更好的描述here
  • 这里有同样的问题。每次运行 git svn clone -s https://project/repo project 时,它都会复制 .git/config 中的数据。
  • 我的问题是我重新运行了 git svn clone 操作,但由于 HTTP 打嗝而失败。
【解决方案2】:

删除重复项对我来说仍然是个问题。每次重新运行克隆命令时,例如git svn clone svn://.../svnroot --no-metadata -A authors-transform.txt --stdlayout . 它在 .git/config 中增加了两行。 我必须删除所有包含 branches = branches/:refs/remotes/tags = tags/:refs/remotes/tags/ 的行em>

配置如下所示:

[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
~

【讨论】:

  • 我自己确认了这个解决方案。感谢分享
  • 如果您想从SVN 迁移标签和分支,这将不起作用。这只是一种解决方法。
【解决方案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 正在举手并只是获取所有历史记录以找出答案。 (这种方法仍然需要对每个位置进行完整提取,但这比对每个标签的完整历史提取要快得多)

【讨论】:

    【解决方案4】:

    git-svn 似乎在重复提取相同的修订版本,因为您的 SVN 存储库中有标签。 SVN 的标签概念与 git 略有不同:SVN tags are actually branches(因此为 SVN tags are copies) .

    仔细看看你的输出:

    r1 = d349ed8cb2d76596fe2b83224986275be4600fad (QuoteSvcFix442@2698)

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

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


    一个相关的 SO 问题以及可能的解决方法:Can Git-svn be used on large, branched repositories?

    关于这个问题的一些讨论:git-svn --tags should at least /try/ to handle tags as tags

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多