2013-01-10 69 views
2

我在GitHub上合併了一個pull請求。但是,這是一個錯誤,我想撤銷合併,提交,最重要的是,從歷史記錄中刪除由這幾個提交引入的所有文件。如何完全刪除合併的拉取請求?

我恢復了與另一個提交,它的工作,但文件仍然在提交歷史記錄(他們很大),這將是很好,如果提交本身消失。

我試圖過濾分支刪除文件,但它似乎沒有收縮存儲庫大小(和提交仍然存在)。

我該怎麼辦?

回答

1

使用樹狀過濾器或索引過濾器不起作用。硬復位和重新包裝也沒有。

這裏是什麼工作:

git checkout <commit>

git push --force origin HEAD:master

現在我很好奇,爲什麼這些解決方案沒有奏效。我正在使用git count-objects -v中的尺寸包進行檢查。它是否正確?我應該立即看到尺寸縮小還是僅在推出後才能看到尺寸縮小?

1

恢復提交不會從歷史記錄中刪除文件。

如果你想不僅在當前HEAD不存在的,而且要從來沒有在所有存在的文件,git revert是不是適合你的命令。您需要運行一個filter-branch以完全刪除這些文件。

你說你已經這樣做了,但你沒有告訴我們如何;如果你正確地做到以下幾點:

  • git filter-branch --tree-filter刪除文件
  • git reflog expire --expire={1 second}
  • rm -rf .git/refs/original
  • git gc

... 然後庫應該收縮。你需要最後三個步驟,因爲(按順序):

  • 原來的提交是通過你引用日誌
  • 引用原提交由filter-branch,直到你運行一個垃圾收集存儲在refs/original
  • 可達, 「寬鬆」對象不會被刪除
+0

我想刪除一個文件夾。我試過: git filter-branch --tree-filter'git rm -r --cached --ignore-unmatch badFolder'; git reflog expire --expire = now; rm -rf .git/refs/original; git gc; //然後:git count-objects -v;但大小包沒有下降。 – Allan

+0

@Allan如果您使用的是'git rm'命令,您可能需要'git filter-branch --index-filter'而不是'git filter-branch --tree-filter'。 – Borealid

+1

@Borealid您的解決方案仍然有一些漏洞 - 使用'git reflog expire --expire = now --all'來清理所有reflog(每個分支都有一個reflog,並且在不同的分支中可能還有指針),而不是'git gc',運行'git repack -Ad; git prune --expire = now'('git gc'不會從現有的pack文件中刪除懸掛的對象,'repack'是必要的)。 – twalberg

1

如果你只是想刪除合併和它相關的提交,使用git reset --hard

git reset --hard <commit before merge> 

請注意,這會破壞當前HEAD中未提交的任何更改。它也將刪除合併後發生的所有提交(所以也許你最好使用git rebase)。

重置您的分支後,強制推動它,使新的歷史持久。

免責聲明:重寫已發佈的歷史記錄是個不好的做法。不要這樣做,如果你不需要的話。

+0

不幸的是我必須:( – Allan

4

如@knittl描述

git reset --hard <sha1> 

刪除合併和提交。但是,除非刪除關聯的懸掛對象,否則將不會看到存儲庫大小的任何更改。您還需要通過例如保留對這些對象的引用來終止reflog。

git reflog expire --expire-unreachable=now --all 
git prune 
git repack -a -d