2015-08-24 80 views
5

我不小心提交了一些可能是git中的感性信息(只在本地),我想以簡單的方式將它從git歷史中刪除。將確實git重置刪除歷史?

git reset --soft HEAD~1 

然後取消有感知的信息,並添加到gitignore足以完全從git歷史中刪除它?

回答

4

不,軟復位是不夠的。 這樣做會將文件保留在索引中(您要在其中放置要提交的文件)。這意味着,git仍在跟蹤文件。

你會想要做一個混合重置,它也將這些文件分開。正如René指出的那樣,刪除文件或將其添加到您的.gitignore也是一個好主意,因此您不會意外重新提交它。

這足夠讓敏感信息不會傳輸到git push上的遠程服務器。

但是,該信息仍在您的本地存儲庫中。如果您通過意外重置太遠而「鬆動」提交,git reflog是一個非常有用的工具。

我們清潔所有了所有提交,所有不可通過一個分支或標記:

git reflog expire --expire=1.minute --all 
git prune 
git gc 
  1. 刪除所有條目從舊的引用日誌超過1分鐘。如果有任何剩餘的引用,提交將不會被刪除。這樣的引用可以來自另一個提交,一個分支,一個標籤以及reflog。
  2. 刪除所有無法訪問的提交。
  3. 做了一些家務任務。欲瞭解更多信息看documentation

reflog expireprune是破壞性操作。我建議首先使用--dry-run參數運行這些命令,以查看究竟刪除了什麼。

2

不需要--softgit reset HEAD~1將通過重置索引以及移動HEAD來暫停當前提交文件。

然後.gitignore將足以忽略該文件。

你的意思是我應該先做git reset --soft HEAD~1,然後git reset HEAD <file>

不,您需要刪除所有提交以確保歷史記錄不會包含您的敏感文件。

git reset HEAD~1 
echo sensitiveFile >> .gitignore 
git add .gitignore 
git add -A . 
git commit -m "Redo commit, without sensitiveFile" 
+0

爲什麼我的示例不夠? git reset HEAD 從歷史記錄中刪除文件,不是嗎?這還不夠嗎? – Mattias

+0

@Mattias'git reset HEAD - '只重置一個文件,但不會更改當前提交(其中仍包含敏感文件)。你可以在沒有你的文件的情況下進行新的提交,但是歷史記錄(以前的提交)仍然會引用敏感文件。要真正將其從歷史中刪除,您需要重做以前的提交,而不僅僅是文件。 – VonC

+0

如果我執行'git reset --soft HEAD〜1',它會重置爲前一個提交(提交之前的那個提交),然後執行'git reset HEAD - ',這將刪除感應文件從git索引,我不會得到完全相同的結果,通過執行'git reset HEAD〜1'除了我保留索引中的所有非檢測文件嗎? – Mattias

2

git reset --soft HEAD~1僅重置HEAD以前的承諾,而指數和工作目錄沒有被觸及。

這意味着索引和工作目錄仍然反映了包含敏感信息的狀態。只需從索引git reset HEAD <file>...中刪除這些文件並再次提交。

從索引中刪除敏感數據文件後,它們將保留在工作目錄中。也許你還想從工作目錄中刪除它們或將它們添加到.gitignore

編輯

你的意思是我應該先混帳重置--soft HEAD〜1,然後混帳復位HEAD?

是。通常情況下,您將文件git add ..放置然後提交它們。如果您執行git reset --soft HEAD~1,那麼您的存儲庫會反映該提交之前的狀態。如果您執行git status,則可以看到此內容。所以你可以修改索引並重新提交。

此外,這是否從git歷史中刪除數據100%?

不,不完全。如果提交不再被引用,git會在90天后刪除它(默認值 - 請參閱git gc)。如果你想立即刪除它,你必須確保它不再被引用。因此,您必須從任何包含它的reflog中刪除它,例如git reflog --delete [email protected]{3}。通常,它將包含在HEAD和您的分支的reflog中。還要確保它不包含在任何分支中,例如如果提交如果是A則執行git branch -a --contains A。輸出必須爲空。

然後你可以使用git gc --prune=now垃圾收集它。使用git log -n1 COMMIT-ID檢查提交是否已被刪除。它應該輸出fatal: bad object

有關從git中移除文件和主題的詳細信息,請參閱我的博客https://www.link-intersystems.com/blog/2014/07/17/remove-directories-and-files-permanently-from-git/

+0

你的意思是我應該先做git reset --soft HEAD〜1然後git reset HEAD ?此外,這是否從git歷史中刪除數據100%?只是想確定。 – Mattias