簡體   English   中英

刪除git中的空提交

[英]Remove empty commits in git

我剛剛將一個項目從Mercurial遷移到Git。 當你添加標簽時,Mercurial會添加空提交,所以我最終在Git中提交了我要刪除的空提交。

如何從Git中刪除空提交(其中沒有任何文件的提交)?

謝謝。

一個簡單(但很慢)的方法是使用git filter-branch--prune-empty 沒有其他過濾器,任何其他提交都不會被更改,但任何空提交都將被丟棄(這將導致所有后續提交都有新的父ID,因此仍然“重寫歷史記錄”:如果這是你的初始從hg導入到git,但如果其他人已經在使用這個存儲庫,這是一個大問題。

注意所有過濾分支的常見警告。 (另外,作為旁注,“空提交”實際上是與前一次提交具有相同樹的那個:它不是根本沒有文件,而是它具有所有相同的文件,具有相同的模式,與父提交相同的內容。這是因為git為每個提交存儲完整的快照,而不是從一個提交到下一個提交的差異。)


這是一個很小的例子,隱藏了很多你可以做的更好的地方:

$ ... create repository ...
$ cd some-tmp-dir; git clone --mirror file://path-to-original

(第一個克隆步驟是為了安全: filter-branch可能非常具有破壞性,所以在新克隆而不是原始克隆上啟動它總是好的。使用--mirror意味着它的所有分支和標簽也在這個副本中被鏡像。 )

$ git filter-branch --prune-empty --tag-name-filter cat -- --all

(現在等待可能很長時間;請參閱有關加快這一點的方法的文檔。)

$ git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

(此步驟是從文檔中復制出來的:它會在運行過濾器之前丟棄所有原始分支。換句話說,它會使過濾永久化。因為這是一個克隆,即使過濾器出錯,這也是相當安全的。 )

$ cd third-tmp-dir; git clone --mirror file://path-to-filtered-tmp

(這會對過濾后的副本進行干凈,精心壓縮的副本,而過濾步驟中沒有剩余的對象。)

$ git log     # and other commands to inspect

一旦確定已過濾的克隆的克隆是好的,您就不需要過濾的克隆,並且可以使用最后一個克隆代替第一個克隆。 (也就是說,您可以用最終克隆替換“真實原始”。)

使用--commit-filter應該比使用--prune-empty更快

$ git filter-branch --tag-name-filter cat --commit-filter 'git_commit_non_empty_tree "$@"' -- --all

然后按照torek的回答清理備份引用

$ git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

從這里開始: Git - 使用filter-branch刪除帶有空變更集的提交

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM