0%

git lfs 使用

Case 1. 从 0 开始配置使用 git-lfs

我们要指定 git-lfs 会把哪些文件当作大文件,指定方式比如有:

指定文件后缀名

git lfs track “.filetype”
指定某个目录下的所有文件
git lfs track “directory/

具体指定某个文件
git lfs track “path/to/file”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
> mkdir <repo>
> cd <repo>
> git init
> git lfs track "*.filetype" # 比如 *.zip

# 其实 git lfs track 会修改 .gitattributes 文件的内容,可以做一个快速的验证
# > cat .gitattributes
# *.zip filter=lfs diff=lfs merge=lfs -text

# 下面假定在 Github 有一个远程仓库供我们使用
# 往仓库里加你先前指定的文件类型的大文件
> git add .
> git commit -m ""
> git branch -M main
> git remote add origin git@github.com:<username>/<remote_repo_name>.git # 这里替换为自己的用户名和远程仓库名
> git push -u origin main
# 此时命令行会显示
# > uploading LFS objects
# 如果没有采用 git-lfs,则显示如下内容
# > Enumerating objects: 3, done.
# Counting objects: 100% (3/3), done.
# Delta compression using up to 8 threads
# Compressing objects: 100% (2/2), done.

Case 2. 要在已有的仓库上用 git-lfs 追踪某些文件

此时只是简单的使用 git lfs track “” 是没用的,因为你之前的 commit 已经生成了快照,你无法追踪历史中的这些大文件。

git-lfs 只会在你开始设置的此刻之后追踪新生成的指定文件

可以快速做个验证,假设我们还在这个仓库里⬇️

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> ls > test1.txt
> ls -l > test2.txt
> git add test1.txt test2.txt
> git commit -m "Add txt files"

# 假设我们现在要把 txt 文件当成是大文件,我们可能会想这么做
> git lfs track "*.txt"
> git add .gitattributes
> git commit -m "Track *.txt files"
> git lfs ls-files # 此时你会发现 git-lfs 并没有追踪 txt 文件

> echo "hello" > test3.txt
> git add test3.txt
> git commit -m "Add test3.txt"
> git lfs ls-files # 此时你可以在输出中看到 test3.txt

正确的方法是使用 git lfs migrate,这里只列举了简单的用法,更复杂的可以看看手册。比如可以用 –include-ref= 指定分支,多个分支的时候最好一个分支一个分支地迁移,最后是 git push –all -f

1
2
3
4
5
6
> git lfs migrate import --include="*.txt"  # 在当前分支上执行
> git lfs ls-files # 此时可以发现 text1.txt 和 text2.txt 也被追踪到了
> git push --force # 让远程仓库也改过来
Case 3. 不再跟踪某些文件
> git lfs untrack "*.filetype"
> git rm --cached "*.txt"

其他常用命令

查看当前 git-lfs 正在追踪的文件类型

git lfs track
查看当前 git-lfs 正在追踪哪些文件
git lfs ls-file

参考文档

详解 Git 大文件存储(Git LFS)
Jenkins 中的 Git-LFS 设置
git-lfs 指南
git-lfs-migrate(1) - Migrate history to or from Git LFS

------------- 本文结束 感谢您的阅读-------------