Bootstrap

Git 仓库 大文件管理


  1. 为什么 Git 仓库和本地项目文件夹一样大?

    • 原因:初始化一个 Git 仓库并添加文件(git add + git commit)时,Git 会把所有被添加的文件的内容和元信息(例如提交历史、文件的哈希值等)存储在 .git 文件夹中。初次添加时 .git 的大小可能接近整个项目的大小,因为每个文件生成一个压缩的快照。
    • 直接删除本地源文件后

      如果这些文件已经被添加并提交到 Git 仓库,只要 .git 文件夹完好,数据都可以通过 git checkout HEAD -- <文件路径>  恢复
      如果文件只是用 git add 添加到暂存区,但没有 git commit,它们依然可能保存在 .git/index 中,可以通过工具恢复(复杂且不可靠)。
    • 使用分支操作删除文件前,创建一个新分支保存当前状态:git branch backup-files

压缩本地空间的措施

1. 删除不必要文件

初始化或提交前,

  1. 在项目根目录创建 .gitignore 文件。
  2. 将不需要的文件和目录添加到 .gitignore
  3. 执行 git rm --cached <文件或目录> 删除已经添加到暂存区但不需要版本控制的文件。
# 忽略编译文件和临时文件
*.class
*.log
*.tmp

# 忽略 IDE 配置文件(例如 IntelliJ IDEA)
.idea/
*.iml

# 忽略特定目录
build/
dist/
2. 清理 Git 仓库历史

如果已经有提交历史导致仓库变得很大:

  1. 检查仓库大小:输出包含 .git 文件夹的大小、压缩包大小等信息。

    git count-objects -vH
    
  2. 移除历史中的大文件:这将删除历史中所有提到该文件的记录。

    git filter-repo --path <文件路径> --invert-paths
    
  3. 瘦身 Git 仓库:执行垃圾回收,移除未引用的历史对象。

    git gc --aggressive --prune=now
    

根据 GitHub 官方文档,每个使用 Git Large File Storage (LFS) 的帐户都会获得 1 GiB 的免费存储空间每月 1 GiB 的免费带宽查看 Git 大型文件存储使用情况 - GitHub 文档

Git LFS 的工作原理

  1. 将大文件的实际内容存储在一个专用的外部服务器上。这通常是托管平台(如 GitHub)提供的 LFS 存储服务。本地仓库中仅保存文件的引用信息,例如一个文件指纹(OID)和相关元数据,而非实际的大文件内容。

  2. 如何存储大文件?用 Git LFS 跟踪某类文件(比如 .zip 文件)时,提交这些文件时,Git 并不会直接把文件内容存储在 .git 中,而是用一个指向外部存储的“指针”文件代替。只有在你需要访问该文件时,LFS 才会从外部存储中下载实际内容到本地。

使用 Git LFS 的操作流程

# 初始化 Git LFS
git lfs install

# 告诉 LFS 要跟踪哪些文件类型
git lfs track "*.zip"

# 将跟踪规则保存到仓库(在 .gitattributes 文件中)
git add .gitattributes

# 添加并提交大文件
git add large-file.zip
git commit -m "Add large file"

# 推送到远程仓库(包括 LFS 对象)
git push origin main

结果:large-file.zip 的实际内容被上传到 LFS 外部存储。本地 .git 文件夹不会包含实际的大文件内容。

当然是限制存储配额的GitHub 为每个仓库提供有限的免费 LFS 存储空间

;