如何从Git历史记录中删除文件?


91

前一段时间,我添加了必须是私有的info(files)。从项目中删除不是问题,但我还需要从git历史记录中删除它。

我使用Git和Github(私人帐户)。

注意:在此线程 上显示了类似的内容,但这是一个旧文件,该文件已添加到功能分支,该分支合并到开发分支,最后合并到主分支,因为这样做已经做了很多更改。因此不一样,需要更改历史记录并隐藏该文件以保护隐私。


3
您将不得不重写历史记录。git rebase然后git push -f
Cory Kramer,


filter-branch建议的重复项中描述的方法将执行您想要的操作。
1615903年

另外stackoverflow.com/a/17890278指向了BFG,它比使用BFG更快git filter-branch
-Hasturkun

但只是走得更快,并执行相同操作,并且需要使用Java我阅读@Hasturkun
Marcos R. Guevara

Answers:


114

我找到了这个答案,它有所帮助:

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch path_to_file" HEAD

在这里找到它https://myopswork.com/how-remove-files-completely-from-git-repository-history-47ed3e0c4c35


5
警告:这会产生大量的提交并导致分歧。您可能必须强行推后,但我太害怕了。
sudo

1
赞同@sudo所说的,但这确实对我偶然承诺的我的新分支起作用.env。快速而准确的解决方案。
Joe Scotto

1
确实,一个简单的推压就可以了!我也很害怕,但是备份了一切。
wutBruh

1
您还可以将提交范围指定为最后一个参数。如果所讨论的提交是最近的,请执行<previous_hash>..HEAD并节省一些时间。
Victor Sergienko

在此之后,它仅对我git push --force
有用

48

如果您最近提交了该文件,或者该文件在一次或两次提交中已更改,那么建议您使用rebasecherrypick删除该特定提交。

否则,您将不得不重写整个历史记录。

git filter-branch --tree-filter 'rm -f <path_to_file>' HEAD

当您对更改感到满意并适当地确保一切正常之后,您需要更新所有远程分支机构-

git push origin --force --all

注意:-这是一项复杂的操作,您必须了解自己在做什么。首先尝试在演示存储库上进行操作,以了解其工作原理。您还需要让其他开发人员知道这一点,以便他们在此期间不做任何更改。


重写整个历史记录后,要保留对存储库(github)的更改,必须做什么?
Marcos R. Guevara

谢谢,我将等待完成,并使用演示存储库进行尝试,我将在此处完成所有更新。
Marcos R. Guevara

错误地,我忘记添加--all。现在,只要我重新运行带有两个参数的push,它就会显示所有最新信息。并且该文件不会从其他分支中删除。我现在该怎么办?
Reeshabh Ranjan

为什么您的建议使用--tree-filter而不是--index-filter@PetroFranko的答案?
einpoklum

14
  • 删除文件并从使用删除的文件所做的提交中重写历史记录(这将从您提交的文件中创建新的提交哈希):

    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 origin --force --all

  • 现在告诉您的合作者rebase



7
  • 首先,将其添加到您的.gitignore文件中,不要忘记提交文件:-)
  • 您可以使用以下站点:http : //gtiignore.io.gitignore为您生成并将所需的路径添加到二进制文件/文件夹

  • 将文件添加到后,.gitignore您可以使用BFG删除“旧”二进制文件。


How to remove big files from the repository

您可以使用git filter-branch或BFG。 https://rtyley.github.io/bfg-repo-cleaner/

BFG Repo-Cleaner

git-filter-branch的替代方法。

BFG是git-filter-branch的一种更简单,更快的替代方法,用于从Git存储库历史记录中清除不良数据

*删除疯狂的大文件*
*删除密码,凭据和其他私人数据

示例(来自官方网站)

在所有这些示例中,bfg是java -jar bfg.jar的别名。

# Delete all files named 'id_rsa' or 'id_dsa' :
bfg --delete-files id_{dsa,rsa}  my-repo.git

在此处输入图片说明


6

我阅读了这篇GitHub文章,将我带到以下命令(类似于公认的答案,但更可靠):

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

4

git-repo-filter

git建议使用git-filter-repogit filter-branch执行命令时)。为什么它比其他任何替代方法都更好的原因有很多(https://github.com/newren/git-filter-repo#why-filter-repo-instead-of-other-alternatives),我的经验是它非常简单而且非常快速。

此命令从所有分支的所有提交中删除文件:

git filter-repo --path <path to the file or directory> --invert-paths

可以使用多个--path参数指定多个路径。您可以在这里找到详细的文档:https : //www.mankier.com/1/git-filter-repo

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.