git - 从 git 存储库中删除文件(历史)

标签 git version-control git-rewrite-history

(已解决,见题体底部)
找了很久了,目前为止我得到的是:

几乎相同的方法,但它们都将对象留在包文件中......卡住了。
我尝试了什么:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_name'
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc

包中还有文件,我是这样知道的:

git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3

还有这个:

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch file_name" HEAD
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune

同样...

尝试了 git clone 技巧,它删除了一些文件(其中约 3000 个)但最大的文件仍然存在...

我在存储库中有一些大的遗留文件,大约 200M,我真的不希望它们存在...而且我不想将存储库重置为 0 :(

解决方案: 这是删除文件的最短方法:

  1. 检查 .git/packed-refs - 我的问题是我有一个远程存储库的 refs/remotes/origin/master 行,删除它,否则 git 不会删除这些文件
  2. (可选) git verify-pack -v .git/objects/pack/#{pack-name}.idx |排序-k 3 -n | tail -5 - 检查最大的文件
  3. (可选) git rev-list --objects --all | grep a0d770a97ff0fac0be1d777b32cc67fe69eb9a98 - 检查那些文件是什么
  4. git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_names' - 从所有修订中删除文件
  5. rm -rf .git/refs/original/ - 删除 git 的备份
  6. git reflog expire --all --expire='0 days' - 使所有松散对象过期
  7. git fsck --full --unreachable - 检查是否有任何松散的对象
  8. git repack -A -d - 重新打包
  9. git prune - 最终删除那些对象

最佳答案

如果没有访问您的存储库数据,我不能肯定地说,但我相信可能有一个或多个打包的引用仍在引用您运行 git filter-branch 之前的旧提交。这可以解释为什么 git fsck --full --unreachable 不会将大 blob 称为无法访问的对象,即使您已经使 reflog 过期并删除了原始(未打包的)refs。

这是我要做的(在完成 git filter-branchgit gc 之后):

1) 确保原始引用已消失:

rm -rf .git/refs/original

2) 使所有 reflog 条目过期:

git reflog expire --all --expire='0 days'

3) 检查旧的打包 refs

这可能会很棘手,具体取决于您有多少打包的引用。我不知道有任何 Git 命令可以自动执行此操作,因此我认为您必须手动执行此操作。备份 .git/packed-refs。现在编辑 .git/packed-refs。检查旧引用(特别是,查看它是否打包了来自 .git/refs/original 的任何引用)。如果您发现任何不需要的旧文件,请将其删除(删除该 ref 的行)。

清理完 packed-refs 文件后,查看 git fsck 是否注意到无法访问的对象:

git fsck --full --unreachable

如果这样做有效,并且 git fsck 现在报告您的大 blob 无法访问,您可以继续下一步。

4) 重新打包您打包的存档

git repack -A -d

这将确保无法访问的对象被解包并保持解包。

5) 修剪松散的(无法到达的)对象

git 修剪

那应该就可以了。 Git 确实应该有更好的方法来管理打包的引用。也许有更好的方法,我不知道。在没有更好的方法的情况下,手动编辑 packed-refs 文件可能是唯一的方法。

关于git - 从 git 存储库中删除文件(历史),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2164581/

相关文章:

git - 自动修复相同消息和作者(完整存储库)的连续提交

git - 无法在 Git 中重命名文件

version-control - TFS - 执行文件合并时看不到目标分支

git - 我如何提交并推送到 GitHub 上其他人的存储库?

c++ - 迁移到 SVN,对删除旧文件感到困惑

.net - Visual Studio 中的 MSTest 项目 : which files to commit to version control?

git - 将整个开发分支重新定位到新的主分支

git - 我应该在镜像仓库还是原始仓库上运行 BFG?

git - Jenkins 和 Bitbucket 集成

git - bitbucket 从 https 切换到 ssh