我正在用历史上的许多大型tarball清理本地git repo。我执行了以下步骤:
FILE_LIST=`git rev-list master | while read rev; do git ls-tree -lr $rev | cut -c54- | sed 's/^ +//g;'; done | grep <tarball name> | awk '{print $2}' | sort | uniq | tr '\n' ' '`
git filter-branch --tag-name-filter cat --index-filter "git rm -r --cached --ignore-unmatch $FILE_LIST" --prune-empty -f -- --all
rm -rf .git/refs/original/ && git reflog expire --expire=now --all && git gc --aggressive --prune=now
git push origin --force --all && git push origin --force --tags
通过这样做,我大大减少了本地仓库的大小。但是,经过上述步骤,当我从源头获得干净的克隆文件时,克隆存储库的大小并没有减少,但通过验证以下那些大压缩包已经消失了
FILE_LIST=`git rev-list master | while read rev; do git ls-tree -lr $rev | cut -c54- | sed 's/^ +//g;'; done | grep <tarball name> | awk '{print $2}' | sort | uniq | tr '\n' ' '`
我在克隆的仓库中再次进行了垃圾收集步骤,大小没有减小。
任何人都知道如何减少原始服务器上的repo大小?预先感谢。
git rev-list --all --objects | # catalog of everything
git cat-file --batch-check='%(objectname) %(objectsize) %(rest)' | # sha, size, name
awk '$2>limit{print $1}' limit=$((1*1024*1024))' # just the oversize ones
将告诉您回购中最大的对象。找到介绍它们的提交只是通过
进行搜索git log --all --raw --no-abbrev --pretty=format:%H \
| awk 'NF==1 { commit=$1 } NF!=1 { print commit,$4 }'
用于匹配您的大对象,将大id写入文件并通过原始日志从文件中进行grep -Ff
处理将向您显示哪些提交引入了哪个大对象。弄清楚其余的,我留给你。