我想把一个Git项目放在GitHub上,但它包含某些具有敏感数据的文件(用户名和密码,如/config/deploy。卡皮斯特拉诺的Rb)。
我知道我可以将这些文件名添加到.gitignore中,但这不会删除它们在Git中的历史记录。
我也不想通过删除/来重新开始。git目录。
是否有一种方法可以删除Git历史记录中特定文件的所有痕迹?
我想把一个Git项目放在GitHub上,但它包含某些具有敏感数据的文件(用户名和密码,如/config/deploy。卡皮斯特拉诺的Rb)。
我知道我可以将这些文件名添加到.gitignore中,但这不会删除它们在Git中的历史记录。
我也不想通过删除/来重新开始。git目录。
是否有一种方法可以删除Git历史记录中特定文件的所有痕迹?
当前回答
明确一点:公认的答案是正确的。先试试。然而,对于某些用例来说,这可能是不必要的复杂,特别是当你遇到诸如'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回购的问题。如果这是不可接受的,你将不得不使用另一种方法。
我们可以称之为“核选项”。
其他回答
在我的android项目中,我有admob_keys.xml作为分开的xml文件在app/src/main/res/values/文件夹。要删除这个敏感的文件,我使用下面的脚本和工作完美。
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch app/src/main/res/values/admob_keys.xml' \
--prune-empty --tag-name-filter cat -- --all
它看起来是这样的:
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
这是我在windows下的解决方案
git filter-branch——tree-filter "rm -f 'filedir/filename' Git push—force
确保路径正确 否则行不通
我希望这对你们有帮助