Git 仓库 大文件管理
-
为什么 Git 仓库和本地项目文件夹一样大?
- 原因:初始化一个 Git 仓库并添加文件(
git add
+git commit
)时,Git 会把所有被添加的文件的内容和元信息(例如提交历史、文件的哈希值等)存储在.git
文件夹中。初次添加时.git
的大小可能接近整个项目的大小,因为每个文件生成一个压缩的快照。 - 直接删除本地源文件后:
如果这些文件已经被添加并提交到 Git 仓库,只要.git
文件夹完好,数据都可以通过git checkout
HEAD -- <文件路径> 恢复
如果文件只是用git add
添加到暂存区,但没有git commit
,它们依然可能保存在.git/index
中,可以通过工具恢复(复杂且不可靠)。 -
使用分支操作:删除文件前,创建一个新分支保存当前状态:git branch backup-files
- 原因:初始化一个 Git 仓库并添加文件(
压缩本地空间的措施
1. 删除不必要文件
初始化或提交前,
- 在项目根目录创建
.gitignore
文件。 - 将不需要的文件和目录添加到
.gitignore
。 - 执行
git rm --cached <文件或目录>
删除已经添加到暂存区但不需要版本控制的文件。
# 忽略编译文件和临时文件
*.class
*.log
*.tmp
# 忽略 IDE 配置文件(例如 IntelliJ IDEA)
.idea/
*.iml
# 忽略特定目录
build/
dist/
2. 清理 Git 仓库历史
如果已经有提交历史导致仓库变得很大:
-
检查仓库大小:输出包含
.git
文件夹的大小、压缩包大小等信息。git count-objects -vH
-
移除历史中的大文件:这将删除历史中所有提到该文件的记录。
git filter-repo --path <文件路径> --invert-paths
-
瘦身 Git 仓库:执行垃圾回收,移除未引用的历史对象。
git gc --aggressive --prune=now
根据 GitHub 官方文档,每个使用 Git Large File Storage (LFS) 的帐户都会获得 1 GiB 的免费存储空间 和 每月 1 GiB 的免费带宽。查看 Git 大型文件存储使用情况 - GitHub 文档
Git LFS 的工作原理
-
将大文件的实际内容存储在一个专用的外部服务器上。这通常是托管平台(如 GitHub)提供的 LFS 存储服务。本地仓库中仅保存文件的引用信息,例如一个文件指纹(OID)和相关元数据,而非实际的大文件内容。
-
如何存储大文件?用 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 存储空间