首页 > 其他分享 >处理.git文件夹过大出现臃肿问题-filter-branch和BFG工具

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

时间:2023-07-13 15:24:00浏览次数:43  
标签:文件 git BFG -- jar branch bfg pack

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,BFG,--,jar,branch,bfg,pack
From: https://www.cnblogs.com/eternality/p/17550629.html

相关文章

  • git-diff
    1.diff说明用于比较两次修改的差异1-1.参数参数描述–cached显示暂存区(已add但未commit文件)和最后一次commit(HEAD)之间差异。–staged同--cached。–stat查看简单的diff比较结果。1-2.改动范围说明@@-l,s+l,s@@:其中l是起始行号,s是......
  • git-tag
    1.tag简介1-1.说明tag就是对某次commit的一个标识,相当于起了一个别名创建的标签会在.git/refs/tags下1-1-1.查看tags目录ls.git/refs/tagsv1.0.0v2.0.01-1-2.查看tags下的标签文件cat.git/refs/tags/v1.0.0f3d2540bdaf36e6b0092ccd0d3aa908c19f2f7081-2.ta......
  • git-worktree
    1.说明git-worktreegitworktree非常适合大型项目又需要维护多个分支,想要避免来回切换的情况优点gitworktree可以快速进行并行开发,同一个项目多个分支同时并行演进gitworktree的提交可以在同一个项目中共享gitworktree和单独clone项目相比,节省了硬盘空间,......
  • Git 基础入门
    Git基础入门一、安装与配置1.下载安装https://git-scm.com/download/ 2.使用入口win:右键菜单—gitbashmac:终端窗口 3.基础配置a.首次使用添加身份说明,使用以下两个命令:$gitconfig--globaluser.name"你的昵称"$gitconfig--globaluser.email邮箱 b.......
  • 常用gitignore
    #file.build.cmake-build-debug.idea#Prerequisites*.d#CompiledObjectfiles*.slo*.lo*.o*.obj#PrecompiledHeaders*.gch*.pch#CompiledDynamiclibraries*.so*.dylib*.dll#Fortranmodulefiles*.mod*.smod#CompiledStaticlibraries*.lai*.la*.a*.lib#......
  • 如何实现r语言做logit回归的具体操作步骤
    R语言做Logit回归Logit回归是一种常用的统计分析方法,可以用来研究二元分类问题。它可以对因变量的概率进行建模,并利用自变量的线性组合来预测分类结果。本文将介绍如何使用R语言进行Logit回归分析,并给出相应的代码示例。数据准备首先,我们需要准备用于Logit回归分析的数据。考虑......
  • Git备忘录
    环境:Windows安装Git下载地址:https://git-scm.com/download配置Git安装完成后需要配置,开始菜单打开“GitCMD”或右键打开“OpenGitBashhere”。配置用户名和提交用到的邮箱#配置用户名gitconfig--globaluser.name"xxx"#配置邮箱gitconfig--globaluser.email......
  • Git小白到老鸟的进阶之路
    小白:师兄,师兄,上次你教我的操作,我傻乎乎的执行了一遍,可是那个Git究竟是什么那?师兄:小白莫慌,Git就是一种版本控制,小白,你平时写论文,是不是也按日期保存成许多的版本那。小白:对呀,对呀。师兄:那开发项目的时候,每个人开发的部分都不一样,需要记录多个版本,这个就是我们伟大的Git做得。小白:师......
  • 常用git指令
    常用git指令一.gitpull相关将远程指定分支拉取到本地指定分支上gitpullorigin<远程分支名>:<本地分支名>将远程分支拉倒当前分支gitpullorigin<远程分支名>将与本地当前分支名相同的远程分支拉到本地当前分支(需要先关联远程分支)gitpull......
  • TechSmith Snagit mac最强大的屏幕截图软件
    TechSmithSnagitMac版是一款强大的屏幕截图软件,适用于Mac操作系统。它提供了多种截图工具和编辑功能,可以帮助用户轻松地创建高质量的截图和录屏视频。→→↓↓载TechSmithSnagitmac 以下是TechSmithSnagit的一些主要特点:多种截图方式:TechSmithSnagit支持多种截图方式......