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

前一段时间我添加的信息(文件)必须是私有的。从项目中删除不是问题,但我还需要从git历史中删除它。

我使用Git和Github(私人账号)。

注意:在这个线程上显示了类似的东西,但这里是一个旧文件,它被添加到一个特性分支,该分支合并到一个开发分支,最后合并到master,因此,做了很多更改。所以这是不一样的,需要的是改变历史,并隐藏这些文件的隐私。

207963 次浏览

如果你最近提交了该文件,或者该文件在一次或两次提交中发生了变化,那么我建议你使用rebasecherrypick来删除该特定的提交。

否则,你就得重写整个历史。

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

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

git push origin --force --all

注意:-这是一个复杂的操作,你必须知道你在做什么。首先尝试在演示存储库中执行它,看看它是如何工作的。您还需要让其他开发人员了解它,这样他们就不会同时做出任何更改。

我找到了这个答案,它很有用:

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

删除文件并重写提交历史(这将从你提交的文件中创建新的提交哈希):

有两种方法:

  1. 使用git-filter-branch:

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <path to the file or directory>' --prune-empty --tag-name-filter cat -- --all

  1. 使用git-filter-repo:
pip3 install git-filter-repo
git filter-repo --path <path to the file or directory> --invert-paths

现在强制推送repo: git push origin --force --all并告诉你的合作者rebase

使用高炉煤气repo-cleaner包是git-filter-branch的另一个可行的替代方案。显然,它也更快……

我读取了这篇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
  • 首先,将它添加到你的.gitignore文件中,不要忘记提交文件:-)

  • 你可以使用这个站点:http://gitignore.io为你生成.gitignore,并将所需的路径添加到你的二进制文件/文件夹中。

  • 一旦你将文件添加到.gitignore,你可以删除"旧"二进制文件与BFG。


# < >强How to remove big files from the repository < / >强

你可以使用git filter-branch或BFG。 https://rtyley.github.io/bfg-repo-cleaner/ < / p >
< p > # # # BFG Repo-Cleaner git-filter-branch的替代方法

BFG是一个更简单、更快的Git -filter-branch的替代方案,用于清除Git存储库历史中的错误数据:

***删除疯狂的大文件***

  • 删除密码,凭据&其他私人资料

例子(来自官方网站)

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

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

enter image description here

git-filter-repo

git建议使用第三方插件git-filter-repo(当执行git filter-branch命令时)。有一个很长的列表,为什么它比任何其他替代品更好(https://github.com/newren/git-filter-repo#why-filter-repo-instead-of-other-alternatives),我的经验是,它非常简单,非常快。

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

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

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

为了删除特定文件的历史记录,应该在每个项目中逐一应用以下命令,但必须在一开始就从项目中进行备份,因为文件将被删除

  • git filter-branch——index-filter "git rm——cached——ignore-unmatch ProjectFolderName < / >强/ src / main /资源/ application-prod.properties"头

  • git push origin——force——all

  • git update-ref -d refs/original/refs/heads/master .

..........................................................................

  • git filter-branch——index-filter "git rm——cached——ignore-unmatch ProjectFolderName < / >强/ src / main /资源/ application.properties"头

  • git push origin——force——all

  • git update-ref -d refs/original/refs/heads/master .