猿问

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

很长时间以来,我一直在寻找以下内容:


http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/ 和

http://progit.org/book/ch9-7.html

几乎相同的方法,但是它们都将对象保留在打包文件中...卡住了。

我试过的


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 :(


解决方案:这是摆脱文件的最短方法:


检查.git / packed-refs-我的问题是我在refs/remotes/origin/master远程存储库中有一行,请将其删除,否则git不会删除那些文件

(可选) git verify-pack -v .git/objects/pack/#{pack-name}.idx | sort -k 3 -n | tail -5 -检查最大的文件

(可选) git rev-list --objects --all | grep a0d770a97ff0fac0be1d777b32cc67fe69eb9a98 -检查哪些文件

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_names' -从所有版本中删除文件

rm -rf .git/refs/original/ -删除git的备份

git reflog expire --all --expire='0 days' -使所有松散的物体失效

git fsck --full --unreachable -检查是否有松散的物体

git repack -A -d -重新包装

git prune -最终删除那些对象


扬帆大鱼
浏览 785回答 3
3回答

翻翻过去那场雪

我不能肯定地说不能访问您的存储库数据,但是我相信可能有一个或多个打包引用仍然引用您运行前的旧提交git filter-branch。这可以解释为什么git fsck --full --unreachable即使您的reflog已过期并删除了原始(未打包的)ref,也不会将大blob称为不可访问的对象。这是我会怎么做(后git filter-branch并git gc已经完成):1)确保原始裁判不见了:rm -rf .git/refs/original2)使所有reflog条目过期:git reflog expire --all --expire='0 days'3)检查旧包装的裁判这可能很棘手,具体取决于您有多少个打包的引用。我不知道可以自动执行此操作的任何Git命令,因此我认为您必须手动执行此操作。备份.git/packed-refs。现在编辑.git/packed-refs。检查是否有旧的裁判(尤其是查看是否包装了的任何裁判.git/refs/original)。如果您发现任何不需要的旧文件,请将其删除(删除该引用的行)。完成清理packed-refs文件后,请查看是否git fsck注意到无法访问的对象:git fsck --full --unreachable如果这行得通,并且git fsck现在报告您的大Blob无法访问,则可以继续执行下一步。4)重新打包打包的档案git repack -A -d这将确保无法到达的对象被解压并保持解压。5)修剪松散(无法到达)的物体git prune那应该做到的。Git确实应该有更好的方法来管理打包的引用。也许有我不知道的更好的方法。在没有更好的方法的情况下,手动编辑packed-refs文件可能是唯一的方法。
随时随地看视频慕课网APP
我要回答