我想把一个Git项目放在GitHub上,但它包含某些具有敏感数据的文件(用户名和密码,如/config/deploy。卡皮斯特拉诺的Rb)。
我知道我可以将这些文件名添加到.gitignore中,但这不会删除它们在Git中的历史记录。
我也不想通过删除/来重新开始。git目录。
是否有一种方法可以删除Git历史记录中特定文件的所有痕迹?
我想把一个Git项目放在GitHub上,但它包含某些具有敏感数据的文件(用户名和密码,如/config/deploy。卡皮斯特拉诺的Rb)。
我知道我可以将这些文件名添加到.gitignore中,但这不会删除它们在Git中的历史记录。
我也不想通过删除/来重新开始。git目录。
是否有一种方法可以删除Git历史记录中特定文件的所有痕迹?
当前回答
更改密码是一个好主意,但对于从回购历史记录中删除密码的过程,我推荐BFG回购- cleaner,这是一个更快、更简单的替代Git -filter-branch,专门用于从Git回购中删除私人数据。
创建一个private.txt文件,列出你想要删除的密码等(每行一个条目),然后运行以下命令:
$ java -jar bfg.jar --replace-text private.txt my-repo.git
你的回购历史记录中所有小于阈值大小(默认为1MB)的文件将被扫描,任何匹配的字符串(不是你最近提交的)将被替换为字符串“***REMOVED***”。然后你可以使用git gc清除死数据:
$ git gc --prune=now --aggressive
BFG通常比运行git-filter-branch快10-50倍,并且选项是围绕以下两个常见用例进行简化和定制的:
删除疯狂的大文件 删除密码,凭证和其他私人数据
完全披露:我是好心眼巨人回收清理器的作者。
其他回答
它看起来是这样的:
git rm --cached /config/deploy.rb
echo /config/deploy.rb >> .gitignore
从git中删除跟踪文件的缓存,并将该文件添加到.gitignore列表中
你可以使用git的forget-blob。
它的用法很简单,git forget-blob file-to-forget。你可以在这里获得更多信息
https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
它将从历史记录、reflog、标签等所有提交中消失
我时不时地会遇到同样的问题,每次我都要回到这个帖子和其他帖子,这就是为什么我把这个过程自动化了。
感谢Stack Overflow的贡献者,是他们让我把这些放在一起
使用filter-branch:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *file_path_relative_to_git_repo*' --prune-empty --tag-name-filter cat -- --all
git push origin *branch_name* -f
For all practical purposes, the first thing you should be worried about is CHANGING YOUR PASSWORDS! It's not clear from your question whether your git repository is entirely local or whether you have a remote repository elsewhere yet; if it is remote and not secured from others you have a problem. If anyone has cloned that repository before you fix this, they'll have a copy of your passwords on their local machine, and there's no way you can force them to update to your "fixed" version with it gone from history. The only safe thing you can do is change your password to something else everywhere you've used it.
有了这些,下面是如何解决它的方法。GitHub在FAQ中回答了这个问题:
Windows用户注意:在此命令中使用双引号(")而不是单引号
git filter-branch --index-filter \
'git update-index --remove PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force
2019年更新:
这是FAQ中的当前代码:
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \
--prune-empty --tag-name-filter cat -- --all
git push --force --verbose --dry-run
git push --force
请记住,一旦您将这段代码推到GitHub等远程存储库,其他人已经克隆了该远程存储库,您现在就处于重写历史的情况下。在此之后,当其他人尝试下拉您的最新更改时,他们将收到一条消息,指示无法应用更改,因为它不是快进。
为了解决这个问题,他们必须删除现有的存储库并重新克隆它,或者遵循git-rebase手册中“从UPSTREAM REBASE中恢复”的说明。
提示:执行git rebase—交互式
将来,如果您不小心提交了一些涉及敏感信息的更改,但在推送到远程存储库之前注意到了这些更改,有一些更容易的修复方法。如果上次提交是添加敏感信息的提交,您可以简单地删除敏感信息,然后运行:
git commit -a --amend
这将使用您所做的任何新更改来修改之前的提交,包括使用git rm删除整个文件。如果更改在历史上更早,但仍然没有推送到远程存储库,您可以进行交互式rebase:
git rebase -i origin/master
这将打开一个编辑器,其中包含自与远程存储库的最后一个共同祖先以来所做的提交。在表示提交敏感信息的任何行上,将“pick”更改为“edit”,然后保存并退出。Git将遍历这些更改,并将您留在以下位置:
$EDITOR file-to-fix
git commit -a --amend
git rebase --continue
对于每个具有敏感信息的更改。最终,您将回到您的分支,并且您可以安全地推动新的更改。
明确一点:公认的答案是正确的。先试试。然而,对于某些用例来说,这可能是不必要的复杂,特别是当你遇到诸如'fatal: bad revision -prune-empty'之类的讨厌错误时,或者真的不关心你的回购历史。
另一种选择是:
CD到项目的基本分支 删除敏感代码/文件 rm -rf .git/ #删除所有git信息 你的代码 去github并删除你的存储库 按照本指南将您的代码推送到一个新的存储库,就像您通常会做的那样 https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/
当然,这将删除所有提交历史分支,以及来自你的github回购和本地git回购的问题。如果这是不可接受的,你将不得不使用另一种方法。
我们可以称之为“核选项”。