一、背景与问题分析

在 Git 仓库中,若频繁通过 “替换.jar 文件→git add→git commit→git push” 的流程更新.jar 文件,会导致.pack 文件快速膨胀。这是因为.jar 文件属于二进制文件,Git 对其增量压缩效果极差,每次更新都会全量存储新文件,进而使得.pack 文件占用过多磁盘空间,影响仓库性能与存储效率。

二、准备工作

2.1 工具与环境要求

  1. 操作系统:支持 Windows、macOS、Ubuntu/Debian 等主流系统。

  2. 必备工具:Git(已安装并配置好用户信息)。

  3. 辅助工具:Git LFS、BFG Repo - Cleaner(或 git filter - repo)、Java 环境(运行 BFG 需用)。

2.2 仓库备份

在进行任何操作前,务必备份仓库,以防操作失误导致数据丢失。

  1. 打开命令行工具(Windows 为 CMD 或 PowerShell,macOS 和 Linux 为终端)。

  2. 执行以下命令复制仓库到备份目录:

cp -r 你的仓库目录 你的仓库目录_备份

例如:若仓库目录为 /home/user/myrepo,则执行 cp -r /home/user/myrepo /home/user/myrepo_backup

三、配置 Git LFS 管理.jar 文件

3.1 安装 Git LFS

  1. Ubuntu/Debian 系统

打开终端,执行以下命令:

sudo apt-get install git-lfs
  1. macOS 系统(需安装 Homebrew)

在终端中运行:

brew install git-lfs
  1. Windows 系统

可通过 Git 安装包附带的 LFS 组件进行安装,在安装 Git 时勾选 “Git LFS” 选项即可。

3.2 初始化 Git LFS

  1. 进入你的仓库目录:

cd 你的仓库目录
  1. 执行初始化命令(仅需在仓库中执行一次):

git lfs install

3.3 配置 LFS 跟踪.jar 文件

  1. 在仓库中执行以下命令,让 LFS 跟踪所有.jar 后缀的文件:

git lfs track "*.jar"

提交跟踪规则(此步骤确保团队成员能同步该配置):

git add .gitattributes
git commit -m "用LFS跟踪所有jar文件"
git push

3.4 按原有习惯更新.jar 文件

配置完成后,更新.jar 文件的操作与之前一致:

  1. 替换仓库中的.jar 文件,例如用新的 app.jar 覆盖旧文件:

cp /path/to/new/app.jar ./app.jar

(其中 /path/to/new/app.jar 是新.jar 文件的路径,./app.jar 是仓库中要替换的.jar 文件路径)

2. 正常提交推送:

git add app.jar
git commit -m "更新app.jar到v2.1"
git push

四、清理历史中已有的.jar 文件

4.1 工具选择与安装

4.1.1 BFG Repo - Cleaner(简单快速)

  1. 下载 BFG 工具,需 Java 环境支持,下载地址:https://rtyley.github.io/bfg-repo-cleaner/

  2. 将下载的 bfg - x.x.x.jar 文件保存到方便操作的目录,例如当前用户的主目录。

4.1.2 git filter - repo(更原生)

  1. 安装 git filter - repo,部分系统可通过包管理器安装,也可从源码安装。

  2. Ubuntu/Debian 系统可尝试:

sudo apt-get install git-filter-repo

4.2 移除历史中的.jar 文件

4.2.1 使用 BFG 工具

  1. 打开命令行工具,进入 BFG 工具所在目录。

  2. 执行以下命令删除所有历史提交中的.jar 文件:

java -jar bfg-1.14.0.jar --delete-files "*.jar" 你的仓库目录

(将 bfg-1.14.0.jar 替换为实际下载的 BFG 文件名,你的仓库目录替换为仓库的实际路径)

4.2.2 使用 git filter - repo

  1. 进入仓库目录:

cd 你的仓库目录
  1. 执行以下命令删除历史中所有.jar 文件:

git filter-repo --force --path '*.jar' --invert-paths

4.3 清理残留数据并推送

  1. 清理本地冗余对象:

git reflog expire --expire=now --all
git gc --prune=now --aggressive
  1. 强制推送到远程(此操作会覆盖远程历史,务必提前通知团队成员):

git push --force

五、后续维护与注意事项

5.1 团队协作

清理历史后,团队其他成员需重新克隆仓库,避免基于旧仓库拉取导致冲突,克隆命令:

git clone 仓库远程地址

5.2 忽略构建产物

若.jar 文件是编译生成的(非源代码依赖),在.gitignore 中添加以下内容忽略:

/build/*.jar
/target/*.jar  # Maven/Gradle构建目录

添加后执行提交:

git add .gitignore
git commit -m "忽略构建生成的jar文件"
git push

5.3 定期维护

偶尔执行以下命令清理本地不再引用的旧.jar 版本:

git lfs prune

5.4 风险提示

  1. 强制推送会覆盖远程仓库历史,可能导致团队成员的本地仓库与远程不一致,需提前沟通。

  2. 清理历史文件操作具有不可逆性,务必确保已做好仓库备份。

  3. 使用 Git LFS 时,需确保远程 Git 服务器支持 LFS(如 GitLab、GitHub 均原生支持,自建服务器可能需要额外配置)。

(注:文档部分内容可能由 AI 生成)