gpt4 book ai didi

处理.git文件夹过大出现臃肿问题-filter-branch和BFG工具

转载 作者:我是一只小鸟 更新时间:2023-07-13 22:31:42 26 4
gpt4 key购买 nike

Git开发手册 。

git一些不常用的命令记不住,可以查看 git开发手册 (https://m.php.cn/manual/view/34957.html) 。

1、.git/objects/pack 文件过大 。

今天从git拉取项目进行开发的时候克隆的很慢,还以为是网速的问题。查看了一些git命令框的拉取网络速度发现网速也很快,克隆下来后才发现是.git文件夹太大,项目代码占用很小。发现了是git的问题后,就第一时间查找下是那个地方出的问题导致文件过大.

进入.git目录后发现是/objects/pack目录下面的xxx.pack文件占用过大.

2、pack文件过大出现的原因 。

在开发过程中有时候不小心上传了大文件,虽然后面在目录里面删除了,但会被git记录下来。这样慢慢的记录的越来越多,就变为了目前这样文件太大。出现臃肿。我们可以使用git自带的filter -branch工具或者BFG进行仓库清理.

3、使用git filter-branch清理 。

进入git命令框,输入命令。首先查询出3个大文件信息 。

                          git verify-pack -v .git/objects/pack/pack-xxx.idx | sort -k 
                          
                            3
                          
                           -n | tail -
                          
                            3
                          
                           (xxx你的.git的pack目录文件)
                        

查询结果 。

                          73671b13992abba02a7fa56d37735d4ac01803b1 blob   
                          
                            62992368
                          
                          
                            62936889
                          
                          
                            132214388
                          
                        

在根据上面的文件名的编码ID:73671b13992abba02a7fa56d37735d4ac01803b1 查询出大文件的名称:

                          git rev-list --objects --all | grep 73671b13992abba02a7fa56d37735d4ac01803b1
                        

上面的为单个查询,我们也可以直接查询多个,把上面的两个命令合并一起执行.

                          git rev-list --objects --all | grep 
                          
                            "
                          
                          
                            $(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')
                          
                          
                            " #查询前10个大文件
                          
                        

通过命令查询出文件信息,然后将该文件从历史记录的所有 tree 中移除,执行命令从历史中删除指定的大文:

                          git filter-branch --force --index-filter 
                          
                            "
                          
                          
                            git rm -rf --cached --ignore-unmatch 文件/文件夹
                          
                          
                            "
                          
                           --prune-empty --tag-name-filter cat -- --all #文件/文件夹 是通过上面查询出来的大文件路径和名称
                        

执行成功后需要删除和重建索引 。

                          git 
                          
                            for
                          
                          -each-
                          
                            ref
                          
                           --format=
                          
                            '
                          
                          
                            delete %(refname)
                          
                          
                            '
                          
                           refs/original | git update-
                          
                            ref
                          
                           --stdin 
                        

然后设置历史记录的过期时间为现在,默认为90天.

                          git reflog expire --expire=now --all #所有未关联对象过期时间为现在
                        

通过gc清理文件并优化本地存储库 。

                          git gc --aggressive --prune=now
                        

强制提交 。

                          git push --all --force origin
                        

执行完毕上面命令,一个大文件我们就清理完毕了,如果有多个大文件需要一个文件一个文件的执行。当大文件都清理完毕我们可以查看当前目录下个文件及目录占用空间大小 。

                          du -sh .git
                        

如果输出文件过大,可以继续查找相关大文件进行删除.

                          git count-objects -v #计算解包的对象数量及其磁盘消耗量
                        

4、高效大文件清理工具 BFG 。

官网地址: BFG (https://rtyley.github.io/bfg-repo-cleaner/ )BFG是git-filter-branch的替代品,官方介绍说要比 git-filter-branch 快上10~720x,本人使用了下,确实很快。值得我们去使用。需要去官网下载bfg.jar。也可以去 镜像仓库下载 (https://repo1.maven.org/maven2/com/madgag/bfg/)这里使用1.14.0版本。由于是jar包运行bfg需要具备java环境。简单介绍下命令,也可以自己去官网查找相关命令.

通过 --mirror  拉取自己项目的.git 文件, --mirror参数只拉取.git文件不克隆代码,防止操作失误修改项目代码.

                          git clone --mirrot xxx.git
                        

查询前10个大文件 。

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

通过删除目录文件删除 。

                          java -jar bfg.jar --delete-folders {dev} --no-blob-protection project.git #{dev} 删除dev目录下面的所有文件
                        

通过文件大小删除 。

                          java -jar bfg.jar --strip-blobs-bigger-than 10M project.git #删除文件大于10M
                        

通过文件名字删除,先通过查询大文件查询出数据,然后通过文件名称执行该命令删除

                          java -jar bfg.jar --delete-files "xxxx"  project.git
                          

java -jar bfg.jar --delete-files "xxxx" --no-blob-protection project.git

删除敏感信息 。

                          java -jar bfg.jar --replace-text pwd.txt project.git
                        

pwd.txt自己定义需要移除数据的文本,具体语法自己可以查找相关文档.

设置过期时间为现在 & 清理文件 。

                          git reflog expire --expire=now --all && git gc --prune=now --aggressive
                        

推送到远程 。

                          git push --mirror
                        

最后我们在执行下 du -sh .git 命令查询一些.git文件夹大小,发现一些没有的文件我们已经清理干净了。后面需要重新从git克隆代码,不要使用之前的.git文件进行提交。否则文件会变得更大.

  。

最后此篇关于处理.git文件夹过大出现臃肿问题-filter-branch和BFG工具的文章就讲到这里了,如果你想了解更多关于处理.git文件夹过大出现臃肿问题-filter-branch和BFG工具的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com