我创建了一个Git仓库,该仓库将完全存储在本地,我想知道对于二进制文件是否真的需要Git LFS?据我所见,.gitattributes
已正确配置为:
*.psd binary
是的,这些文件会落在.git/objects/...
中,但它们被压缩并且不占用太多空间。那么,总结一下,如果我从未推送/拉取到远程仓库,Git LFS 在本地仓库中有哪些好处?
谢谢!
类型 | 变更 | 文件大小 | 作为git-lfs blob | 作为git blob | 经过git gc后 |
---|---|---|---|---|---|
Vectorworks (.vwx) | 添加几何图形 | 28.8 MB | 28.8 MB | 26.5 MB | 1.8 MB |
GeoPackage (.gpkg) | 添加几何图形 | 16.9 MB | 16.9 MB | 3.7 MB | 3.5 MB |
Affinity Photo (.afphoto) | 切换图层 | 85.8 MB | 85.6 MB | 85.6 MB | 0.8 MB |
FormZ (.fmz) | 添加几何图形 | 66.3 MB | 66.3 MB | 66.3 MB | 66.3 MB |
Photoshop (.psd) | 切换图层 | 25.8 MB | 25.8 MB | 15.8 MB | 15.4 MB |
Movie (mp4) | 剪辑 | 13.1 MB | 13.1 MB | 13.2 MB | 0 MB |
删除文件 | -13.1 MB | 0 MB | 0 MB | 0 MB |
# Creating a remote repository on a volume (attached drive or NAS)
cd path/to/remote
mkdir origin
# create a bare git repository in origin
cd origin
git init origin --bare
# Add remote to local repository
cd path/to/local/repository
git remote add origin <path/to/remote/origin>
# Enable Git-LFS in local repository
git lfs install
# Track filetype psd
git lfs track "*.psd"
# Configure lfs of the local repository
git config --add lfs.customtransfer.lfs-folder.path lfs-folderstore
git config --add lfs.standalonetransferagent lfs-folder
git config --add lfs.customtransfer.lfs-folder.args "Volumes/path/to/remote/origin"
# Commit changes
git commit -am "commit message"
# Push media to remote
`git push origin master`
如果您的远程路径包含空格,请使用"'
。
您可以通过调用Git垃圾收集器git gc
来压缩您的git存储库的大小。但它不会触及Git-LFS blobs。
只有当blob已被推送到远程并且包含blob的提交比最近的提交(3天)旧时,Git-LFS才会从本地存储库.git/lfs/objects/
中删除blob。如果您想手动执行此操作,请使用以下命令:
# remove lfs duplicates
# https://github.com/git-lfs/git-lfs/blob/main/docs/man/git-lfs-dedup.1.ronn
git lfs dedup
# clean old local lfs files (>3 days of commit)
# https://github.com/git-lfs/git-lfs/blob/main/docs/man/git-lfs-prune.1.ronn
git lfs prune
git gc
垃圾回收之后,它只剩下1.8 MB,对吗?与git lfs
的始终保持26.5 MB的blob相比。仅仅从表格上看,人们可能会认为运行git gc
会在已经存在的26.5 MB git blob之上再增加1.8 MB。请澄清一下。 - Gabriel Staplesgit gc
会压缩它,而 git lfs
则保持原样。Git LFS 的唯一优点是,它会将较旧的 blob 从本地仓库移动到远程仓库,而默认的 Git 会在本地和远程都保留所有内容。 - Alexander Goglgit-lfs
将旧版本的文件内容存储在云端,同时保留它们在磁盘上的历史记录。这有两个主要好处。
git clone
的大小。显然,如果仓库从未共享,则第1点不适用。
如果这些二进制文件真的很大,并且您经常更改它们,它们可能会开始影响您可用的免费磁盘空间。如果是这样,git-lfs可以通过将二进制文件的旧副本卸载到云存储中来获得好处。
幸运的是,如果本地仓库变得太大,您总是可以使用BFG Repo Cleaner后期应用git-lfs。
据我所见,.gitattributes已正确配置为:
*.psd binary
这是与git-lfs
无关的另一个问题。
git lfs
的两个明显的“好处”:它减少了git仓库初始克隆的大小,以及减小了本地仓库的大小。但是,我认为这两个方面都是“负面”的,因为它们带来了一个巨大的代价:git checkout
的时间。在过去的3年里,我在一个庞大的单一仓库中工作,其中一个单独的git checkout
经常需要3小时以上,而不是几秒钟。这就是上述两个“好处”的代价。所以,今天,我强烈建议不要使用git lfs
。更多细节请参见我的问题链接。 - Gabriel Staples为了补充已由@Schwern提供的出色答案并回应楼主的评论。
这里是Atlassian关于GIT LFS的文档链接link,Atlassian是支持此扩展的两家主要公司之一(另一家是GitHub)。
这个想法是二进制文件会在“远程”仓库中进行“延迟”下载,即在检出过程中而不是克隆或获取过程中进行。
从技术上讲,git lfs存储的是对二进制文件进行“延迟”评估的指针。
这样做很有意义,因为git必须能够在每次提交后为您提供对代码库状态的访问,“延迟”下载的二进制文件使得以下情况成为可能:
即使您决定移除并提交 a.bin,这个说法仍然成立,"commit A"之后仍有可能访问文件系统状态。所以,如果您明确不需要版本 1,则至少在本地存储它是没有意义的。
另外需要说明的是:是的,您必须在本地启用 git lfs 支持,但还需要在远程仓库上启用 git lfs 支持(我曾在 Bitbucket 上这样做过,我相信其他竞争对手也支持)。
git lfs
非常糟糕:git checkout
过程经常需要花费我3个多小时,而不是几秒钟。" - Gabriel Staples
binary
属性仅影响git diff
的行为。我认为它不会影响文件的存储方式。 - Keith Thompson