2012-07-06 15 views
19

私はgitにsvn repoを複製するために次のコマンドを使いました。実行した後、いくつかの偽のブランチがあります。git-svn clone |偽のブランチ

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

git branch -a

*(no branch) 
    master 
    remotes/abc-1.3.x 
    remotes/[email protected] 
    remotes/[email protected] 
    remotes/branch_test_script 
    remotes/tags/modules-1.2 
    remotes/tags/[email protected] 
    remotes/tags/[email protected] 
    remotes/tags/release-1.1 
    remotes/tags/[email protected] 
    remotes/tags/[email protected] 
    remotes/trunk 

のsvnで作成された実際の枝は、ABC、branch_test_script、モジュール、およびリリースしました。 誰かが '[email protected]'、 '[email protected]' ... '[email protected]'などの内容を理解するのに役立つことができますか?

これらの偽のブランチをどのように取り除くことができますか/それらは何を意味していますか?

おかげで、
Gayathri

+0

私はこのネーミングがどこから来た、本当に苦労見つけることがありますが、それは彼らが最初に作ったのsvnブランチ(またはタグ)によって、もはや参照されていないことが判明したコミットされSVNから作成されたこれらの枝のように見えます。コミットのブランチ名を回復できることを除いて、Gitの参照されていないコミットと似ています。 – fork0

+0

@ fork0:返信いただきありがとうございます。しかし、私はSVNで存在することができる方法を参照されないコミットするよう明確に理解しません。参照はどのように失われますか?これについてあなたの考えを分かち合うことができますか? – crankparty

+0

私は分かりません。たぶん、SVNリポジトリのメンテナーが決してそれらをきれいにすることはできませんでした(またはSVNには全く能力がありません)。参照が失われたというわけではなく、むしろ履歴の早い時点からコミットを開始したばかりの人 – fork0

答えて

15

TL; DR:

git svnは、これらの「@」を作成します - ブランチ(またはタグ)のサブディレクトリ用に作成された場合には枝(またはのgit - SVNで追跡されていない別のディレクトリ)。同じ名前の "通常の"ブランチもありますが、接尾辞 "@"はありません。 "@"ブランチは、通常ブランチの分岐ポイントとしてのみ存在します。


注:私はこれに対してパッチを提出しました。この説明の編集されたバージョンは、新しいセクション「SVNブランチの扱い」(Git 1.8.1以降)として、git svnのマンページの一部になっています。


はSubversionでは、ブランチとタグは、ディレクトリツリーの単なるコピーであるので、それはそれ自体のブランチ(またはトランク)であるディレクトリからブランチを作成する(通常は落胆が)可能です。例えば、/ trunk/copy/trunk/fooを/ branches/barにコピーすることで、/ trunk( "サブディレクトリブランチ")をコピーするか、トランク/タグ/ブランチ構造外にあるディレクトリをコピーするSVNで可能)。

しかしgitでは、ブランチは常にリポジトリ全体に対応し、サブディレクトリは存在しません。したがって、git svnは回避策を使用します。 git-svnによってブランチとして追跡されていないディレクトリからコピーされたブランチを検出すると、新しい履歴が作成されます。例えば、/トランク/ fooはr1234で/分岐/バーにコピーされたサブディレクトリのブランチのために、それが作成されます:

  • 新しいGitは数があることに注意(後方にr1233から各SVNのリビジョンのコミットブランチが作成される前の最後のリビジョン)。これらのコミットのツリーには、分岐したサブディレクトリのみが含まれます。 r1233の各リビジョンでは、通常、2つのgitコミットがあります.1つはツリー全体(git-svnがtrunkの履歴を処理するときに作成されます)と新しいものです。
  • 上記のr1233から作成されたコミットをpoinstする "bar @ 1233"(ブランチ名@リビジョン)というダミーブランチ。
  • ブランチを作成したコミットr1234からのコミット。このコミットは、上のブランチを(唯一の)祖先として持つでしょう。
  • "bar"と呼ばれるブランチで、2番目のコミットを示します。そのようにし

、サブディレクトリ分岐バーのために、あなたは、分岐が

  • バーから作成されたリポジトリの状態を表して1233 @ gitの

    • バー、二つの枝を取得これは私がこのダミーのブランチが作成されている理由はかなりわからないんだけど、分岐

    を表します。私は、分岐がから分岐されたリビジョンについての情報を表現するために行われていると思うし、ブランチのための完全な履歴を持っています。この全体の機構フラグ--no-follow-parentを使用してオフに切り替えることができる


    注。その場合、各SVNブランチはSVNブランチディレクトリからのコミットだけでgitブランチになります。各ブランチは、歴史の残りの部分にunconnnectedされ、最初のブランチにコミットに対応し、独自のルートがコミットされます。

  • 3

    I持っていた私はGitのリポジトリに私のSVNリポジトリをクローン化しすぎて、このような奇妙なと呼ばれる枝。

    期待枝を(あなたのケースではmodules-1.2abc-1.3.xbranch_test_scriptrelease-1.1)確認した後、私は@revisionnumber枝が自分の前に置か枝にコミットするよりも何もしていないことに気づきました。

    あなたは、手動でそれを行うブランチabc-1.3.xgitkオープンと[email protected][email protected]は、そのブランチの履歴に表示ことを確認します。その場合は、それぞれのブランチを削除することができます。

    ブラウズするブランチが多数ある場合やコミットが多い場合、これは少し面倒かもしれません。

    自動道:あなたのためにそれを行うにはgitのを頼む:

    git branch -r --contains [email protected] 
    

    はエコーされます(または少なくともべき

    abc-1.3.x 
    [email protected] 
    [email protected] 
    

    これは、それが含まれているため、安全[email protected]を削除する可能性があることを意味しin abc-1.3.x

    git branch -r -d [email protected] 
    

    SVNの線形履歴のため、当然これも(新しい)コミット541512に含まれています。


    サイドノート:
    あなたはSVNのタグが実際にGitのタグとネイティブGitのブランチに変換されないことに気づいたかもしれません。これは、svn2gitを使ってSVN repoをGitリポジトリにクローン化することで実現できます。

    +0

    これらのブランチを削除するには?そのようなコミットを無視してブランチを作成しないようにgitに渡すことができるパラメータはありますか? – crankparty

    +0

    私が書いたように、ブランチは 'git branch -r -d 'を使って削除することができました。私は、枝が作られていないことを達成するための旗があるとは思わない。 – eckes

    +1

    'git-svn'はこれらの" @ "ブランチを不必要に作成する可能性がありますが、' abc @ 113346'は 'abc'の**祖先ではないという重要なケースがあります。これは、ブランチがサブバージョンで削除され、別のポイントからのコピーによって再度作成された場合に発生します。また、 'abc @ 113346'が' abc'の祖先であるという事実は、これが起こらなかったことを意味するものではなく、 'abc'がトランクにマージされ、削除された(113346以上のいくつかのリビジョンでは)トランクからその場所に作られたもの。 –