2011-04-18 143 views

回答

14

不,沒有什麼像git中的每分支標記。所有分支和標籤都只是Git中的參考類型; ref只是一個指向修訂歷史記錄中特定修訂版的名稱。舉例來說,如果你有develmaster分支機構,並v1.0v2.0標籤,引用會是這個樣子:

 
refs/heads/devel -> * 
        /\ 
        * * <- refs/heads/master 
        | | 
        * * 
        \/
        * <- refs/tags/v2.0 
        | 
        * 
        | 
        * <- refs/tags/v1.0 
        | 
        * 

正如你所看到的,沒有什麼搭售這些標籤的任何分支機構;實際上,所有這些標籤都包含在masterdevel分支中。通過查看您的.git回購庫,您可以看到實際上沒有更多的標籤結構。它只是一個包含引用.git/refs內提交的SHA-1或.git/packed-refs中的一行的文件(標籤經常位於packed-refs中,因爲它們不經常更改,而分支通常是git/refs內的單獨文件)。

所以,如果你想重寫歷史,並保留舊的標籤,你將不得不重寫你的標籤名稱。正如sehe指出的,這是通過使用git filter-branch --tag-name-filter完成的。

+2

......然後將其用'git filter-branch ..... --tag-name-filter cat'完成# – sehe 2011-04-18 14:41:45

+0

@sehe:謝謝,這讓我想起改進[這個腳本](http://stackoverflow.com/questions/4278264/git -split-歷史的幾家,文件,到-A-獨立的分支/ 4283970#4283970) – 2011-04-18 14:55:45

1

您可以命名空間的標籤變成你想要的標籤(種)的分支命名的目錄屬於,而且不必進行手動:

git-thisBranch() { git symbolic-ref --short HEAD; } 
git-localTag() { 
    local name="$1"; shift; 
    git tag $(git-thisBranch)/"$name" "[email protected]"; 
}