我最近克隆了一个 SVN 存储库,其中曾经有一些二进制文件,但不再需要了。不幸的是,我已经将它和包含的二进制文件推送到了 Github。我现在想使用“git filter-branch”删除它们,但在标签和分支方面我遇到了一些问题。
基本上,我创建了一个简单的 shell 脚本来删除由以下命令确定的文件列表:
git rev-list --objects --all | grep .jar > files.txt
删除脚本如下所示:
#!/bin/sh
while read file_hash file_to_remove
do
echo "Removing "$file_to_remove;
git filter-branch --index-filter "git rm --cached --ignore-unmatch $file_to_remove"
rm -rf .git/refs/original/;
git reflog expire --all --expire-unreachable=0;
git repack -A -d;
git prune
done < $1
我有几个标签(全部列在 .git/packed-refs 中),一个 .git/refs/remotes/origin (指向 Github 存储库)。使用上述脚本删除文件没有达到预期的效果(“du -cm”仍然输出相同的大小;“git rev-list”仍然列出文件),直到我手动删除 .git/packed 中的所有引用-refs 和 .git/refs/remotes/origin 目录。
当然,我会失去所有标签,也无法通过这种方法将本地更改推送回 Github。有没有我错过的东西,或者是否有其他方法可以从所有分支/标签中删除文件而不破坏我的历史记录?
提前谢谢了,
马特斯
我最终使用了BFG 回购清理器 http://rtyley.github.io/bfg-repo-cleaner/在裸克隆存储库上(git clone --mirror repo-url)。它遍历每个分支/标签,让每个分支都工作,甚至比过滤分支快得多。希望这可以帮助其他遇到类似问题的人。
这是我的包装脚本:
#!/bin/bash
#usage: ./remove_files.sh file_list.txt bare-repo-dir
while read file_hash file_to_remove
do
echo "Removing "$file_to_remove;
lastFile=`echo $file_to_remove | awk -F/ '{print $NF}'`;
java -jar bfg.jar --delete-files $lastFile $2;
done < $1
cd $2;
git gc --prune=now --aggressive;
cd ..;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)