如何将已作为常规对象提交的单个文件(例如png)转换为git-lfs?
我不想迁移整个仓库,我也不想重写仓库的历史。
答案 0 :(得分:5)
git lfs track
将开始跟踪新文件或已签入存储库的现有文件。当您运行git lfs track
然后提交更改时,它将更新文件,将其替换为LFS指针内容。
这里我有一个已经签入PNG的存储库"通常" (不使用LFS):
C:\Temp\LFS>dir
Volume in drive C is Windows
Volume Serial Number is A442-238A
Directory of C:\Temp\LFS
11/09/2017 11:12 AM <DIR> .
11/09/2017 11:12 AM <DIR> ..
10/20/2017 01:22 PM 48,517 VSTS.png
1 File(s) 48,517 bytes
2 Dir(s) 284,988,436,480 bytes free
C:\Temp\LFS>git status
On branch master
nothing to commit, working tree clean
我不需要对PNG进行任何更改,我只需git lfs track
:
C:\Temp\LFS>git lfs track VSTS.png
Tracking "VSTS.png"
git-lfs已经完成了所需的一切 - 它在.gitattributes
,和中设置了跟踪信息,现在git知道VSTS.png
是改性:
C:\Temp\LFS>git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: VSTS.png
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitattributes
no changes added to commit (use "git add" and/or "git commit -a")
现在,如果我们git add
该文件,它会将LFS对象添加到存储库,我们可以提交更改。将实际做的是git-lfs
将该文件排入LFS存储,并用指针文件替换存储库中的文件,告诉LFS在哪里找到实际的blob,我们可以看看我们是否检查了存储库阶段的内容:
C:\Temp\LFS>git add VSTS.png
C:\Temp\LFS>git cat-file blob :0:VSTS.png
version https://git-lfs.github.com/spec/v1
oid sha256:6075cd5130bdbe29a037cba93dc22158d1443b22b2ffb6acb0d1d541838f26b9
size 48517
(那是实际的LFS元数据,而不是PNG文件。)
现在,当您提交并推送这些更改时,该文件将位于LFS中。但这不具有追溯性 - 您不会重写存储库的历史记录,因此以前版本的PNG仍将直接存储在存储库中(而不是在LFS中),并且仍将占用空间。
如果您确实要重写历史记录,我建议您使用BFG Repo Cleaner。
答案 1 :(得分:2)
仅跟踪文件不会将它们转换为 lfs。它们已经是历史的一部分,转换旧文件的唯一方法是重写历史 [...]
相反,在启用 LFS 跟踪时需要“重新添加”文件。因此,首先启用跟踪:
git lfs track VSTS.png
git add .gitattributes
git commit -m "Enable LFS tracking for VSTS.png"
然后在启用 LFS 跟踪时重新添加文件(具有相同的内容):
git rm --cached VSTS.png
git add VSTS.png
git commit -m "Re-add VSTS.png as an LFS object"
当然,git 历史记录仍然包括 VSTS.png
的全部内容,因为它最初是在没有 LFS 跟踪的情况下提交的。