2012-07-06 115 views
19

我用下面的命令將svn repo克隆到git中,執行後,我看到一些虛假的分支。git-svn clone |虛假分支

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

git branch -a在SVN創建

*(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 

實際分支爲ABC,branch_test_script,模塊和釋放。 有人可以幫助理解'[email protected]','[email protected]'...'[email protected]'等是什麼?

我們如何擺脫這些虛假分支/他們表示什麼?

感謝,
Gayathri

+0

我真的很難找到這個命名來自哪裏,但它看起來像這些分支是從SVN提交創建的,而SVN提交沒有被svn分支(或標記)引用。像Git中的未提交提交一樣,除了可以恢復提交的分支名稱。 – fork0 2012-07-06 06:54:14

+0

@ fork0:謝謝你的回覆。但我不明白如何不參與提交可以在svn中存在。引用如何丟失?你能分享一下你的想法嗎? – crankparty 2012-07-06 07:32:42

+0

我不知道。也許SVN存儲庫的維護者從來沒有清理過它們(或者SVN根本就沒有這種能力?)。我不是故意說引用丟失了,而是有人剛剛開始提交歷史記錄中的早期點 – fork0 2012-07-06 08:42:25

回答

15

TL; DR:

git svn創建這些 「@」 - 如果分支的分支(或標籤)是爲子目錄創建(或針對其不通過GIT-SVN跟蹤另一個目錄)。總是會有一個具有相同名稱的「常規」分支,但沒有「@」後綴。 「@」分支僅作爲常規分支的分支點存在。


注意:我爲此提交了一個補丁;此解釋的編輯版本現在是官方git svn聯機幫助頁的一部分,作爲「處理SVN分支」(自Git 1.8.1以來)的新部分。


在Subversion,分支和標籤只是一個目錄樹的副本,因此有可能(儘管通常推薦)從目錄本身不是一個分支(或主幹)創建一個分支。例如,通過將/ trunk/foo複製到/ branches/bar,而不是複製/ trunk(可以說是「子目錄分支」),或者複製位於trunk/tags/branches結構之外的目錄(即可能在SVN中)。

但是,在git中,一個分支總是用於整個回購,子目錄分支不存在。因此,git svn使用了一種解決方法。如果它檢測到一個分支是從一個目錄中複製而來的,它本身並不是通過git-svn作爲分支進行跟蹤的,它將創建一個新的歷史記錄。例如,對於一個子目錄分支在那裏/主幹/富被複制到R1234 /分支機構/條,它會創建:

  • 一個新的git的承諾從r1233每個SVN版本上向後(注意號碼是分支創建之前的最後一次修訂)。這些提交的樹只會包含分支的子目錄。因此,對於從r1233開始的每次修訂,通常會有兩個git提交,其中一個提交整個樹(當git-svn處理trunk的歷史記錄時創建)以及新的git提交。
  • 稱爲「bar @ 1233」(分支名稱@修訂版)的虛擬分支,指向從上面的r1233創建的提交。
  • 來自r1234的提交,創建分支的提交。這個提交將上面的分支作爲它的(唯一的)祖先。
  • 稱爲「bar」的分支,指向第二次提交。

這樣一來,對於子目錄分支吧,你在Git的兩個分支

  • 吧@ 1233,這表示該分支從
  • 酒吧創建的存儲庫的狀態,代表分支

我不太清楚爲什麼這個假分支被創建。我認爲這是爲了表示分支從哪個修訂版本分支出來的信息,併爲分支機構提供完整的歷史記錄。


請注意,通過使用標記--no-follow-parent可以關閉整個機制。在這種情況下,每個SVN分支都會生成一個git分支,只是SVN分支目錄提交。每個分支都將不受連接到歷史的其餘部分,並且將有其自己的根提交,對應於分支中的第一次提交。

3

我有這樣奇怪的叫分支太多,當我克隆我的SVN回購到一個Git回購。

審查預期的分支(在你的情況modules-1.2abc-1.3.xbranch_test_scriptrelease-1.1)後,我注意到,@revisionnumber分支只不過是在他們的前綴分支機構提交人。

如果你想要做手工,開gitk分支abc-1.3.x並驗證[email protected][email protected]該分支的歷史顯示。如果是這樣,你可以刪除相應的分支。

如果您有許多分支或許多提交瀏覽,這可能有點麻煩。

自動方式:請混帳這樣做對你:

git branch -r --contains [email protected] 

會響應(或至少應該

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

這意味着,因爲它包含你可以安全地刪除[email protected]abc-1.3.x

git branch -r -d [email protected] 

由於SVN的線性歷史記錄,它當然也包含它(更新的)提交541512


旁註:
您可能已經注意到,您的SVN標籤實際上並沒有轉換爲Git標籤和本地的Git分支。這可以通過svn2git將SVN回購克隆到Git回購中實現。

+0

如何刪除這些分支?有沒有任何參數可以傳遞給git忽略這樣的提交而不創建分支? – crankparty 2012-07-09 05:38:01

+0

正如我寫的:可以使用'git branch -r -d '刪除分支。我不認爲有一個標誌可以實現不創建分支。 – eckes 2012-07-09 05:50:48

+1

'git-svn'可能會不必要地創建這些「@」分支,但有一個重要的情況,其中'abc @ 113346'不是'abc'的**祖先。如果分支在Subversion中被刪除並且從另一個點複製再次創建,則會發生這種情況。另外'abc @ 113346'是'abc'的祖先這一事實並不意味着這沒有發生,這可能意味着'abc'被合併到中繼,被刪除(在一些版本高於113346)和一個新的一個創建在它從樹幹的地方。 – 2012-11-08 12:32:29