我需要让回购更小.我想我可以通过从git历史记录中删除有问题的二进制文件来缩小它:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch BigFile'
Run Code Online (Sandbox Code Playgroud)
然后释放对象:
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --aggressive --prune=now
Run Code Online (Sandbox Code Playgroud)
(如果这些命令错误,请随意发表评论.)
问题:如何识别那些大文件,以便我可以评估是否从git历史中删除它们?他们很可能不再在工作树中 - 它们已被删除,并且可能还没有跟踪:
git rm --cached BigFile
Run Code Online (Sandbox Code Playgroud)
Mat*_*ice 22
twalberg的答案就是诀窍.我把它包装成一个循环,这样你就可以按大小顺序列出文件:
while read -r largefile; do
echo $largefile | awk '{printf "%s %s ", $1, $3 ; system("git rev-list --all --objects | grep " $1 " | cut -d \" \" -f 2-")}'
done <<< "$(git rev-list --all --objects | awk '{print $1}' | git cat-file --batch-check | sort -k3nr | head -n 20)"
Run Code Online (Sandbox Code Playgroud)
head -n 20 将输出限制在前20位.根据需要进行更改.
确定问题文件后,请查看此答案以了解如何删除它们.
twa*_*erg 21
您可以找到最大对象的哈希ID,如下所示:
git rev-list --all --objects | awk '{print $1}' | git cat-file --batch-check | sort -k3nr
Run Code Online (Sandbox Code Playgroud)
然后,对于特定的SHA,您可以执行此操作以获取文件名:
git rev-list --all --objects | grep <SHA>
Run Code Online (Sandbox Code Playgroud)
不确定是否有更有效的方法.如果您确定所有内容都在包文件中(而不是松散的对象),则git verify-pack -v生成包含大小的输出,我似乎记得在某个地方看到一个解析该输出并将每个对象与原始文件匹配的脚本.
忍不住优化了 MatrixManAtYrService 的回答:
git rev-list --all --objects | git cat-file --batch-check='%(objectname) %(objecttype) %(objectsize) %(rest)' | grep blob | sort -k3nr | head -n 20
Run Code Online (Sandbox Code Playgroud)
这种方式git rev-list只调用一次(而不是每个显示的对象),脚本更清晰。
| 归档时间: |
|
| 查看次数: |
2814 次 |
| 最近记录: |