2009-07-16 120 views
5

我剛剛第一次使用我的repos(使用git-filter-branch)重寫歷史記錄。問題是,回購有幾個標籤,重寫後似乎完全脫離了結果歷史。我認爲這是由於與標籤相關的歷史沒有被重寫,所以他們必須指向舊的提交。那麼,我能做些什麼來在新的歷史上「應用」標籤。小ASCII藝術,也許更容易理解我的問題:Git,重寫主分支和相關標籤的歷史記錄

原始回購:歷史重寫後gitk --all報道

+ HEAD 
| 
| 
+ TAG 0.2.0 
| 
| 
+ TAG 0.1.0 
| 
| 
+ Initial commit 

回購結構:

+ HEAD 
    | 
    | 
    | 
    | 
    | 
    | 
    | 
    | 
    + Initial commit 
+ HEAD 
| 
| 
+ TAG 0.2.0 
| 
| 
+ TAG 0.1.0 
| 
| 
+ Initial commit 

回答

5

樣子最後一步procedure described here

$ git log --pretty=oneline origin/releases | 
    sed -n -e '/^\([0-9a-f]\{40\}\) Tag\(release\)\? \(.*\)/s--\3|\1|Tag release \3-p' 
    > ~/paludis-git-tags 

$ while read name msg head ; do 
    git tag -m "${msg}" ${name} ${head} ; 
    done < paludis-git-tags 

這個想法是從舊版本的存儲庫中讀取標籤,以便將它們重新應用於新的歷史記錄。


注意:您原來使用git的過濾分支的,你使用:

-- --all 

--將過濾分支選項與修訂選項分開,並且--all重寫所有分支和標記。

它可能保存在標籤就位在新的歷史記錄(我沒有測試它尚未雖然)

+0

感謝VonC,我錯過了' - --all'一部分。幸運的是我有一個存儲庫的備份,並用'--all'選項再次嘗試,它按我的意願工作。 – 2009-07-16 18:10:10

3

首先,你必須重寫標籤太,例如(如VonC said)通過使用--all選項來重寫所有引用。

如果您有帶註釋的標籤(重磅標籤),您還必須使用--tag-name-filter選項,例如,如--tag-name-filter cat。請注意,您不能重寫已簽名的標籤!

+0

謝謝Jakub,我不知道有關帶註釋和簽名的標籤。有用的信息。再次感謝。 – 2009-07-16 20:56:46

1

如果您想執行可以使用git filter-branch完成的更改,那麼您可以使用--tag-name-filter,如上所述。

如果你想做交互式重新裝訂,你需要別的東西。

東西都可以用git rebasetags

如果底墊是互動來完成,您將看到一個bash shell中,您可以進行更改呈現。退出該shell後,標籤將被恢復。

enter image description here

this post

相關問題