2012-02-28 70 views
2

我想克隆一個SVN樹使用git-svn git repo。我想完成一個完整的克隆,包括標籤和分支,但是我遇到了標籤組織的問題。git-svn克隆與奇怪的svn標籤組織

的SVN標籤的文件夾是這樣的:

tags/ 
|-- Backup 
| |-- 20080212 
| `-- 20080217 
|-- V4.0.1 
|-- V4.0.2 
`-- V4.0.3 

我知道git svn clone -T trunk -b branches -t tags/Backup -t tags具有兩倍-t選項,但是這並不完全滿意:

$ git branch -r 
    tags/20080212 
    tags/20080217 
    tags/Backup 
    tags/V4.0.1 
    tags/V4.0.2 
    tags/V4.0.3 
    trunk 

正如你可以看到,所有的標籤在這裏,但有一個是太多了:備份標籤實際上不是一個標籤,而是一個包含標籤的文件夾。問題是它創建了一個複製所有備份分支內容的孤立分支。

現在的問題是:我如何讓git-svn忽略備份文件夾,但知道備份子文件夾作爲標籤,保持經典標籤可用?

作爲獎勵:如何自動命名備份標記爲Backup/20080217而不是20080217

謝謝!

回答

2

git svn不夠智能,無法忽略一組標籤中的備份文件夾,但包含其子文件夾。你已經一堆選項,其中沒有一個是巨大的:

  • 改變底層Subversion版本庫移動所有標籤到子文件夾,讓你的資料庫看起來是這樣的:

    tags/ 
    |--Backup/ 
    | |--20080212 
    | `--20080217 
    `--Versions/ 
        |--V4.0.1 
        |--V4.0.2 
        `--V4.0.3 
    

    然後,您可以使用-t tags/Backup -t tags/Versions來獲取所有標籤。

  • 應付。 Git管理樹形對象的方式雖然令人惱火,但意味着擁有「備份」標籤實際上不會佔用更多空間或減緩大部分Git操作;唯一的影響將是git svn fetch es將需要更長的時間。

  • 編寫您自己的補丁git-svn以啓用處理此方案。如果您將它包含在將來的官方Git版本中,則可獲得獎勵積分。

讓標籤具有不同的名稱是相當容易的,至少。如果您編輯.git/config文件,你應該找到一條線,看起來是這樣的:

tags = tags/Backup/*:refs/remotes/tags/* 

你應該能夠改變這下面來代替:

tags = tags/Backup/*:refs/remotes/tags/Backup/* 

如果你這樣做跑步之間git svn init和第一個git svn fetch,一切都應該工作。否則,您可能需要先刪除舊參考文件,方法是刪除名稱與.git/logs/refs/remotes/tags/,.git/svn/refs/remotes/tags/.git/refs/remotes/tags中的標記名稱匹配的任何文件或文件夾。

我不知道如果你有一個名爲「Backup」的標籤和一個名爲「Backup」的標籤文件夾會發生什麼。我懷疑沒有什麼好處。您需要找到一些方法來避免這種情況,或將備份標籤存儲在名稱不同的文件夾中。

+0

感謝您的長時間答覆。重命名標籤失敗,如下所述:'錯誤:無法爲.git/refs/remotes/tags/Backup/20080212 創建目錄致命:無法鎖定ref'refs/remotes/tags/Backup/20080212' 。 update-ref -m r175 refs/remotes/tags/Backup/20080212 b1aa4898486b123aa6c270e657ee49ffbd8ed3ad:command returned error:128' – CJlano 2012-02-29 21:43:00

+1

你能告訴我'file .git/refs/remotes/tags/Backup'的結果嗎?如果它出現在「目錄」之外,這意味着它不能創建名爲「備份」的文件夾,因爲已經有一個帶有該名稱的標籤。正如我在最後一段中所說的那樣,我會給該文件夾一個不同的名稱以避免衝突;可能使用'tags = tags/Backup/*:refs/remotes/tags/bkutags/*'或類似的代替我在問題中提出的配置行。 – 2012-03-01 10:56:17

0

使用SmartGit克隆存儲庫,它創建正確的標籤,提供更好的翻譯和工作比git-svn更快。

+0

它不會從文件中克隆本地svn:/// url – tback 2013-08-28 06:31:29

+0

是的,從我的回答開始,事情發生了變化,舊的SmartGit可以使用file://協議 – 2013-08-28 07:45:17