36

Subversion リポジトリでブランチが見つかると、git svn fetch が同じ Subversion リビジョンを繰り返し取得するのを見ています。最上位の /trunk、/tags、および /branches ディレクトリを持つ標準の Subversion リポジトリ レイアウトを使用しています (そして、git リポジトリは 'git svn init -s' で作成されました)。ただし、問題のあるブランチは、トランクではなく、トランク内のサブディレクトリから作成されたコピーであることがよくあります。

git svn fetch の出力は通常、次のようになります。

r2537 = d5b22e956157af036d4112e42e8fb927e45758c8 (トランク)
        Mエンタープライズ/VC/libgc/SymbolVenue.cpp
r2538 = cfed4ca0491da0b732f32bfff72ba678450a0915 (トランク)
可能性のある分岐点が見つかりました: http://repo/prod_repos/trunk/Enterprise/VC => http://repo/prod_repos/branches/file_conversion, 2523
W: Refspec glob の競合 (ref: refs/remotes/scripter@832):
予想されるパス: branch/scripter@832
    実際のパス: トランク/エンタープライズ/Python
トランク/エンタープライズ/Python を引き続き使用する
W: Refspec glob の競合 (ref: refs/remotes/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 -Aauthors-transform.txt--stdlayout。.git/configにさらに2行追加します。branchs = branchs / :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
~
于 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

SVN リポジトリにタグがあるため、git-svn は同じリビジョンを繰り返しプルしているようです。SVN のタグの概念は git の概念とは少し異なります: SVN タグは実際にはブランチです(したがって、SVN タグはコピーです)。

出力を詳しく見てみましょう。

r1 = d349ed8cb2d76596fe2b83224986275be4600fad (QuoteSvcFix442@2698)

リビジョンr1 =は見慣れたものに見えますが、残りのテキストはおそらく異なっています。少なくとも、タグ名 (この場合QuoteSvcFix442@2698は ) は同じではありません。

これを防ぐ唯一の方法は、git-svn に SVN タグをスキップさせることだと思います。タグなしでは生きられない場合は、SVN の「タグ」ブランチを実際の git タグに変換することもできます(ただし、最初にすべてのタグ ブランチを取得する必要があります!)


可能な回避策を含む関連する SO の質問:大規模な分岐リポジトリで Git-svn を使用できますか?

この問題に関するいくつかの議論: git-svn --tags は、タグをタグとして処理するために少なくとも /try/ する必要があります

于 2011-07-26T06:12:51.757 に答える