从 Git 代码库历史记录中移除文件

13

我错误地检入了一些敏感文件(到GitHub)。为了解决这个问题,我按照这里的指示(链接)运行了以下命令:

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch settings.json" --prune-empty --tag-name-filter cat -- --all
echo "settings.json" >> .gitignore
git add .gitignore
git commit -m "Add settings.json to .gitignore"
git push origin --force --all
git push origin --force --tags
git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

我可以查看我的提交历史记录以查看已删除的文件。

为解决这个问题,我如何从 Github 的提交历史记录中删除该文件呢?

在此输入图片描述

在此输入图片描述


你还有另一个问题:由于您已经将带有敏感信息的分支推送到远程仓库,所以在此期间,其他人可能已经拉取了该分支。因此,如果您在这里得到答案,也应该意识到猫已经从某种程度上被放出了笼子。 - Tim Biegeleisen
1
请注意,即使您删除了一些提交,只要其他人知道哈希 ID 并且时间还不算“太久”,GitHub 仍然会授予他们访问已删除提交的权限。 “太久” 的时间长度由 GitHub 决定:最终,已删除的提交将无法通过哈希 ID 访问。 - torek
@TimBiegeleisen,该存储库是私有存储库,只有我在使用该存储库。 - Ajit Goel
1
@AjitGoel 好的,那么下面 Von 的回答可能会完全帮你解决困境。 - Tim Biegeleisen
1个回答

12

尝试使用最佳实践,即使用新工具git filter-repo代替BFG和git filter-branch,详情请参考此处

注意:如果在运行上述命令时出现以下错误消息:

Error: need a version of `git` whose `diff-tree` command has the `--combined-all-paths` option`

这意味着你需要更新git


请参见"基于路径的过滤":

git filter-repo --path settings.json --invert-paths

然后执行 git push --force

无需在最后进行所有的repack/gc/prune操作:该工具会为您清理垃圾。


1
谢谢@VonC,我会尝试并告诉您结果。我之前尝试过BFG,但无法使其正常工作。 - Ajit Goel
1
@AjitGoel 是的,filter-repo应该比BFG或filter-branch容易。 - VonC
我遇到了一个"/usr/bin/env: 'python3': Permission denied"的错误。我正在使用Windows 10操作系统。 - Ajit Goel
1
@AjitGoel 请查阅https://dev59.com/2FMI5IYBdhLWcg3wIn1m或https://dev59.com/qlQJ5IYBdhLWcg3wW0qy#56603544。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接