如何从项目中移除git-lfs
Git LFS
Git LFS(Large File Storage)是 Git 的一个扩展,用于处理和管理大型文件和二进制文件。引入 Git LFS 的主要原因包括:
减小仓库体积:普通的 Git 仓库在处理大文件时,仓库的体积会迅速增大,因为 Git 会保存每个版本的完整文件。Git LFS 通过只在本地存储文件的指针,而不是文件的完整内容,减小了仓库的体积。
提高性能:由于 Git 不擅长处理大文件,克隆、拉取和推送操作在有大文件的仓库中会变得非常慢。Git LFS 通过只在需要时下载大文件,提高了这些操作的性能。
优化存储:Git LFS 将大文件存储在一个专门的服务器上,而不是在 Git 仓库中。这使得仓库的存储更加高效,并且可以利用专门的存储解决方案来管理大文件。
为什么不要使用 Git LFS 1
Git LFS 是一把双刃剑, 他之所以厉害, 是因为他把文件替换成了指针, 而之所以不建议使用, 也是因为他把文件替换成了指针.
1. Git LFS 是一个临时解决方案
Git LFS 是在 Git 项目之外开发的,目的是填补 Git 在处理大型文件方面的不足。随着 Git 的不断发展,如果 Git 未来提供了更好的原生支持,Git LFS 的价值将不再存在,这意味着 Git LFS 只是一个临时的解决方案。
2. Git LFS 是不可逆的
一旦在仓库中使用了 Git LFS,移除它将是一个不可逆的决定,需要重写历史并丢失原始的提交 SHA。重写历史在许多情况下是非常昂贵的,尤其是在专业环境中。即使短期内可以接受重写历史,未来的情况也可能发生变化。
在 Mercurial 中,LFS 在某种程度上是一种检出仓库的实现细节。它意味着不改变仓库内容本身(数据),而只是改变你获取该数据的方式。然而在 Git LFS 中,数据本身必须被修改才能成为 LFS 数据,并且”LFS 标志”会被记录在历史中。
3. Git LFS 增加了复杂性
对于 Git 用户来说,Git LFS 增加了额外的复杂性。用户需要安装、配置并了解 Git LFS 的存在。版本控制应该简单易用,大型文件处理也应该如此。Git LFS 的用户体验虽然不错,但由于它不在 Git 核心产品中,其可用性存在上限。此外,Git LFS 也会增加服务器操作的复杂性,因为需要支持一个额外的 HTTP 服务器来处理 LFS 访问。
如何从已经使用了 LFS 的项目中移除 LFS 2
首先给你的git安装上lfs:
git lfs install
然后clone你的仓库, 在你爹项目下把lfs的文件指针都拉下来, 使其变成真实的文件:
git lfs pull
确保你的文件已经不再是指针之后, 我们可以移除 .gitattributes
里的 lfs 相关内容.
接下来, 我们可以尝试列出所有标记为 lfs 的文件, 这条指令理论上会输出所有被标记为 lfs 的文件:
git lfs ls-files
我们需要为每个 lfs 文件都清理掉其在 git 中的缓存:
git rm --cached <文件路径>
如果项目里有很多文件的话, 这会是一个费时费力的操作, 不过好在我们可以使用管道操作来简化这一过程:
git lfs ls-files | cut -f 3 -d ' ' | xargs git rm --cached
然后我们可以用 git add
来提交修改后的文件 (主要是把文件从指针替换成了原始文件). 并且提交你修改后的 .gitattributes
文件.
请在 commit 之前确保你的文件确实已经从文件指针变成了原始文件!
至此, 我们已经成功把 git-lfs 从我们的项目中移除了.