首页 > 解决方案 > 删除整个存储库目录的历史记录或删除 Git 中带有给定消息的提交

问题描述

我有一个历史悠久的 Git 存储库。存储库中的目录之一被跟踪,但包含生成的内容。存储库的大小正在成为一个问题,这是由于生成的目录中的更改,这些更改可以从存储库的其他内容派生(仅由于某些工具限制而被跟踪)。这意味着这个目录的历史不是特别重要,但对于存储库的其余部分,它是。

当我正在寻找在不丢失有用历史记录的情况下减小存储库大小的方法时,我确定了两种方法:仅删除此目录中文件的历史记录,实际上删除此生成目录的历史记录,或删除所有具有特定提交消息的提交,因为在这种情况下,目录仅由具有特定提交消息的提交更改。不幸的是,更好的过滤器,如贡献者姓名或电子邮件,不能用作生成目录的自动化,以模拟仓库的贡献者之一。

这两种方法中的哪一种在 Git 中是可行的?如果两者都有,哪个可能更好?有什么我缺少的方法吗?我在修改 Git 存储库历史方面的经验有限,通常是修复提交消息或擦除某些文件存在的证据,例如机密和密钥。我想在对存储库进行如此大规模的更改之前通知自己。

我认为我不需要添加这个,但以防万一:repo 托管在 GitHub 上,我假设我可以在执行更改后强制推送到 GitHub 以确保 GitHub 上的历史记录以相同的方式更新. 我不希望我可以进行一些更改,这些更改可以在本地工作,但不能作为远程转移到专门的 GitHub,但如果有的话,我想了解它们。

标签: git

解决方案


BFG 回购清洁剂

  1. 下载BFG 回购清理器
  2. bfg --delete-folders path/to/your/content my-repo.git

Git 过滤器分支

git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch path/to/your/content" \
  --prune-empty --tag-name-filter cat -- --all

一旦您乐于重置任何原点,您就需要进行强制推送。


推荐阅读