要删除所有提交历史的一个大的不必要的文件,您可以使用filter-branch
改写每个指数(文件在回购名单)提交因此从未被添加的文件。重写提交历史修改一个文件
git filter-branch --index-filter "git rm --cached --ignore-unmatch path/to/offending_file.wav" --tag-name-filter cat -- --all
但是,如果我想保留该文件,但让它小了很多(例如,想象一下,如果一个图标是一个巨大的图像存储意外)的东西。我尝试这样的做法:
加上一个替换文件到Git的数据库
HASH=`git hash-object -w /tmp/replacement.png`
另外请注意,我们要替换
FILE="path/to/icon.png"
现在筛选指标如下文件:首先检查文件存在于此次提交中:
git cat-file -e :"$FILE"
如果是这样从索引中删除它:
git rm --cached "$FILE"
最后,使用相同的文件名添加对我们替换的引用。
git update-index --add --cacheinfo "100644,$HASH,$FILE"
全部放在一起:
git filter-branch --index-filter "if git cat-file -e :$FILE ; then git rm --cached $FILE ; git update-index --add --cacheinfo 100644,$HASH,$FILE ; fi" --tag-name-filter cat -- --all
这似乎是工作,不会打印可太吓人任何错误。但是,无论有多少git gc
和prune命令我尝试原始blob仍然存在于存储库中。即使我将回购克隆到一个新的地方,它仍然存在。
我怀疑这是因为远程参考,original
引用哪个filter-branch
创建仍然指向旧的树,所以原始文件仍然引用。
我曾尝试用这样的黑客删除他们都:
for REF in `git show-ref | cut -c 42- | grep original` ; do git update-ref -d $REF ; done
与同为remotes
,但斑点仍然存在。
所以我的问题:
- 有没有办法,看看为什么斑被当作垃圾回收?即父母对象在图中指向它?
- 是否有非哈克的方式去除
originals
裁判(也许该遥控器) - 包括所有的分支和标签? - 还有什么我失踪?
是否有包含这个大文件的_many_提交,这样手动重写历史记录不是一种现实的可能性? –
是100次提交。 – Timmmm