Git仓库中大文件查找以及瘦身

在使用Git的过程中,我们有时候误操作将大文件放入到Git的仓库中,这个时候会造成版本库非常大,在后续的网络传输中非常浪费时间。
经过网上查询,可以找出目前版本库中的大文件并且进行删除。
当然这样做的后果是以前添加这个大文件的commit会重新修改,这样就会造成本地分支和远程分支不同步(相同的commit,本地和远程的提交的内容不一样),如果我们确定本地分支没什么问题的话,建议强制将本地的库推送到远程库。

搜索仓库的大文件

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

上面这个命令比较长,其中有Git中的命令也有Linux的命令,下面对这些命令的含义进行记录

1. git rev-list --objects --all

以时间为顺序倒叙列出所有的提交

2. git verify-pack -v .git/objects/pack/*.idx

.idx后缀的文件保存着版本库中的索引,该条命令是验证索引后输出

3. sort -k 3 -n | tail -5 | awk '{print$1}')"

后面的这几条是Linux里面字符串处理命令,sort中的“-k”指的是按照哪一列进行排序,因为我们处理的文本每一行的内容都用空格进行了分割,“-n”是按照大小来进行排序,tail中的“-5”指的是输出前五个,awk中的“'{print$1}'”指的是输出第一列的内容。


所以这条命令的功能是先把版本库中提交点都查找出来,然后通过索引文件查找到文件大小排名前五的提交点,随后取两个结果的交集,我们就知道哪些提交点中有较大的文件了。


重写提交

git filter-branch -f --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch your-file-name' --tag-name-filter cat -- --all

参考:http://blog.csdn.net/lwfcgz/article/details/49453375

1. filter-branch

该命令是让Git重写每一个分支。

  • --force 假如遇到冲突也让git强制执行。

  • --index-filter 选项指定重写的时候应该执行什么命令,要执行的命令紧跟在它的后面,在这里就是git rm --cached --ignore-unmatch password.txt ,让git删除掉缓存的文件,如果有匹配的话。

  • --prune-empty 选项告诉git,如果因为重写导致某些commit变成了空(比如修改的文件全部被删除),那么忽略掉这个commit。

  • --tag-name-filter 表示对每一个tag如何重命名,重命名的命令紧跟在后面,当前的tag名会从标注输入送给后面的命令,用cat就表示保持tag名不变。
    紧跟着的-- 表示分割符,最后的--all 表示对所有的文件都考虑在内。

发表评论

电子邮件地址不会被公开。 必填项已用*标注