2015-08-24 83 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