2015-10-25 278 views
3

我使用了GitHub的instructions for scrubbing a file from the commit history,但它從我的系統中刪除了有問題的文件。這對我來說是令人驚訝的,因爲git rm --cached命令本身應該保持文件本身不變。但是,該行爲也可以在該頁面上的工作示例中看到:嘗試在大git filter-branch ...命令前後運行ls從Git歷史中刪除文件而不刪除文件

我使用的是Git 2.6.1。

如何從提交歷史記錄中刪除文件,而不刪除文件本身?很明顯,我可以做一個備份(我在我的情況下),但這是一個解決方法,而不是一個解決方案。

+1

進行備份是解決方案。 – Schwern

+0

Git主要是一個Unix程序。在Unix中,您不會將每個令人擔憂的情況都集成到您的可執行文件中。你(希望)小型單獨程序合作實現你的目標。 – PSkocik

回答

4

git-filter-branch完成時,它檢出新的分支頭。這會將您的工作目錄更新爲乾淨的狀態。您希望從歷史中刪除的文件已被刪除。預先備份是解決方案。

如果您忘記備份它,仍然可以將其還原! Git需要很長時間才能完成,原來的提交仍然存在。在git-filter-branch之後,將會有一個名爲original/refs/heads/master(如果您過濾了master)的分支,其中包含原始提交。你可以從那裏恢復文件。

一般來說,您可以使用git reflog恢復過濾器和底座。這是每次登錄HEAD時的日誌(即,您簽出或重新綁定或合併或過濾或...)。例如,在做GitHub的過濾器後,例如,git reflog是...

abaabaf (HEAD -> master, origin/master, origin/HEAD) [email protected]{0}: filter-branch: rewrite 
8ef0c30 (refs/original/refs/remotes/origin/master, refs/original/refs/heads/master) [email protected]{1}: clone: 

我可以使用8ef0c30[email protected]{1}(即的HEAD以前的位置)或original/refs/remotes/origin/masteroriginal/refs/heads/master要回,事情是前過濾器運行。

+0

感謝您的徹底解答。這個問題需要在問題中提到的指南中加以說明。 – shadowtalker

4

首先:

(它需要說的。)

當使用git filter-branch你正在做歷史根據你自己(也許越野車)規範在自動方式重寫。因此,你應該在做這件事之前備份你的repo,或者在你的repo的新獨立克隆上執行操作。

爲什麼文件還從你的工作消失複製

git filter-branch應用指定的命令給每個適用的承諾。但是,它並沒有檢查你的工作副本中的這些提交。取而代之的是,默認情況下,它會將它們檢出到.git-rewrite/-d選項的目錄中。 (參見git filter-branch文檔,選項-d <目錄>。)

具有重寫的適用提交後,GIT中檢出所得到的新的分支。由於這是從文件分支(該分支的預重寫版本)切換到沒有該文件的分支(該分支的重寫版本),因此該文件也會從工作副本中刪除。

如何保存文件

那麼,做一個備份。

(請注意,如果你重寫所有部門和所有的標籤,在例如在https://help.github.com/articles/remove-sensitive-data/做了標記或分支機構將不再是一個足夠的備份。)

你怎麼可以,如果你檢索文件沒有那樣做

請參閱Schwern's answer

相關問題