26

次のコマンドを使用してsvnrepoをgitに複製しました。実行後、いくつかの偽のブランチが表示されます。

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/abc-1.3.x@113346
  remotes/abc-1.3.x@541512
  remotes/branch_test_script
  remotes/tags/modules-1.2
  remotes/tags/modules-1.2@113346
  remotes/tags/modules-1.2@516265
  remotes/tags/release-1.1
  remotes/tags/release-1.1@113346
  remotes/tags/release-1.1@468862
  remotes/trunk

svnで作成された実際のブランチは、abc、branch_test_script、modules、releaseでした。誰かが「abc-1.3.x@113346」、「abc-1.3.x@541512」...「release-1.1@468862」などが何であるかを理解するのを手伝ってもらえますか?

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

ありがとう、
Gayathri

4

2 に答える 2

21

tl;dr:

git svnブランチ (またはタグ) がサブディレクトリ (または git-svn によって追跡されない別のディレクトリ) に対して作成された場合、これらの「@」ブランチを作成します。同じ名前の「通常の」ブランチも常に存在しますが、「@」サフィックスはありません。「@」分岐は、通常の分岐の分岐点としてのみ存在します。


注: このためのパッチを提出しました。この説明の編集版はgit svn、新しいセクション「SVN ブランチの処理」として、公式のマンページの一部になりました (Git 1.8.1 以降)。


Subversion では、ブランチとタグはディレクトリ ツリーの単なるコピーであるため、ブランチ (またはトランク) ではないディレクトリからブランチを作成することは (通常はお勧めしませんが) 可能です。たとえば、/trunk (いわば「サブディレクトリ ブランチ」) をコピーする代わりに、/trunk/foo を /branches/bar にコピーするか、trunk/tags/branches 構造の外側にあるディレクトリをコピーします (つまり、 SVN で可能)。

ただし、git では、ブランチは常にリポジトリ全体に対するものであり、サブディレクトリ ブランチは存在しません。 git svnしたがって、回避策を使用します。git-svn によってブランチとして追跡されていないディレクトリからコピーされたブランチを検出すると、新しい履歴が作成されます。たとえば、r1234 で /trunk/foo が /branches/bar にコピーされるサブディレクトリ ブランチの場合、次のように作成されます。

  • r1233 以降の各 SVN リビジョンの新しい git コミット (番号は、ブランチが作成される前の最後のリビジョンであることに注意してください)。これらのコミットのツリーには、分岐されたサブディレクトリのみが含まれます。そのため、r1233 からさかのぼる各リビジョンに対して、通常は 2 つの git コミットがあり、1 つはツリー全体 (git-svn が の履歴を処理したときに作成されます) を含み、もう 1 つtrunkは新しいコミットです。
  • 上記の r1233 から作成されたコミットを指す「bar@1233」(ブランチ名@revision) というダミー ブランチ。
  • ブランチを作成したコミットである r1234 からのコミット。このコミットは、その (唯一の) 祖先として上記のブランチを持ちます。
  • 2 番目のコミットを指す「bar」というブランチ。

そのようにして、サブディレクトリ ブランチ bar の場合、git で 2 つのブランチを取得します。

  • bar@1233 、ブランチが作成されたリポジトリの状態を表します
  • 枝を表すバー

このダミー ブランチが作成される理由はよくわかりません。ブランチがどのリビジョンから分岐したかに関する情報を表し、ブランチの完全な履歴を持つために行われると思います。


このメカニズム全体は、フラグを使用してオフにできることに注意してください--no-follow-parent。その場合、各 SVN ブランチは、SVN ブランチ ディレクトリからのコミットのみを含む git ブランチになります。各ブランチは残りの履歴に接続されず、ブランチの最初のコミットに対応する独自のルート コミットを持ちます。

于 2012-11-15T08:54:48.327 に答える
6

SVN リポジトリを Git リポジトリにクローンしたときも、奇妙な名前のブランチがありました。

予想されるブランチ (あなたの場合modules-1.2は 、abc-1.3.xbranch_test_scriptおよび) を確認した後、ブランチはプレフィックス付きのブランチのコミットに他ならないrelease-1.1ことに気付きました。@revisionnumber

手動で行う場合はgitk、ブランチabc-1.3.xを開いて確認し、そのブランチの履歴に表示されますabc-1.3.x@113346abc-1.3.x@541512その場合は、それぞれのブランチを削除できます。

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

自動的な方法: git に依頼してください:

git branch -r --contains abc-1.3.x@113346

エコーします(または少なくともすべきです)

abc-1.3.x
abc-1.3.x@113346
abc-1.3.x@541512

abc-1.3.x@113346これは、次の場所に含まれているため、安全に削除できることを意味しますabc-1.3.x

git branch -r -d abc-1.3.x@113346

SVN の歴史は直線的であるため、もちろん (より新しい) commit にも含まれてい541512ます。


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

于 2012-07-06T10:01:53.450 に答える