【发布时间】:2019-10-23 20:19:16
【问题描述】:
我正在清理一个本地 git repo,历史上有很多大的 tarball。我做了以下步骤:
- 列出 repo 中的所有 tarball 文件
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
通过这样做,我显着减少了本地 repo 的大小。但是,当我经过上述步骤从源站得到一个干净的克隆时,克隆的 repo 的大小并没有减少,但是通过验证,那些大的 tarball 已经消失了
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 中再次进行了垃圾收集步骤,大小没有减少。
有人知道我可以如何减少原始服务器上的 repo 大小吗?提前致谢。
【问题讨论】:
-
我已经编辑了您的问题,因此命令被格式化为代码。您可以考虑使用反斜杠来编辑带有续行的命令,这样就可以在不滚动到一边的情况下阅读它们。
-
您好 Saurabh,我可以理解远程 repo 的大小在您发布的线程中没有减少,因为远程服务器也需要进行垃圾收集。但我的情况不同,我在清理和推送之后从遥控器做了一个新的克隆。我不希望这个克隆的大小在没有垃圾收集的情况下减少。但经过另一次垃圾回收后,这个克隆的大小并没有减少一个字节,奇怪的是我在历史上也找不到那些大的 tarball。我想知道哪个占用了这么多空间。
-
顺便说一句,我使用 du -h 命令测量 repo 目录大小。
-
您可能想查看此stackoverflow.com/questions/8185276/find-size-of-git-repo 以了解 repo 大小