我创建了一个专门存储在本地的 Git 存储库,我问自己,我是否真的需要用于二进制文件的 Git LFS?据我所知,.gitattributes正确配置如下:
*.psd binary
Run Code Online (Sandbox Code Playgroud)
是的,文件位于 . .git/objects/...,但它们被压缩并且不占用太多空间。总而言之,如果我从不从/向远程存储库推送/拉取,那么在本地存储库中使用 Git LFS 有什么好处?
谢谢!
Ale*_*ogl 13
这取决于您的工作流程和您可以使用的设施。
Git 将文件的版本存储为 blob。这些 blob 是经过 diff 压缩的,因此仅存储差异。因此,文件大小仅略有增加。
如果版本化文件是二进制文件或单个更改会重构整个文件的文件,情况会有所不同。在这种情况下,Git 会存储每个文件的副本,因此存储库会快速增长。
Git 在差异压缩方面做得很好,甚至是大文件。我发现大文件的压缩效果非常好(.git/运行git commit或后版本化文件的大小git gc):
| 类型 | 改变 | 文件大小 | 作为 git-lfs blob | 作为 git blob | git GC 之后 |
|---|---|---|---|---|---|
| Vectorworks (.vwx) | 添加几何形状 | 28.8MB | 28.8MB | 26.5MB | 1.8MB |
| 地理包 (.gpkg) | 添加几何形状 | 16.9MB | 16.9MB | 3.7MB | 3.5MB |
| 相似照片 (.afphoto) | 切换层 | 85.8MB | 85.6MB | 85.6MB | 0.8MB |
| 表格 Z (.fmz) | 添加几何形状 | 66.3MB | 66.3MB | 66.3MB | 66.3MB |
| Photoshop (.psd) | 切换层 | 25.8MB | 25.8MB | 15.8MB | 15.4MB |
| 电影 (mp4) | 修剪过的 | 13.1MB | 13.1MB | 13.2MB | 0MB |
| 删除一个文件 | -13.1MB | 0MB | 0MB | 0MB |
如果您没有可以推送的遥控器,最好不要使用 Git-LFS,因为 Git-LFS 版本化文件似乎根本不添加额外的压缩(见上文)。
这里学到的一个重要教训是,Git 的 diff 压缩方法不适用于 .fmz 等真正的二进制文件。这些将是置于 Git-LFS 版本控制之下的最佳候选者。
对于其他看似非文本但结构类似文本的文件类型(.vwx 或 .afphoto),diff 方法表现良好。在单个用户场景中,总体存储库大小和提交速度至关重要,我不会将它们放在 Git-LFS 版本控制下,因为 Git blob 大小明显小于 LFS blob,从而节省本地和远程空间。
Git-LFS 提供了解决此问题的方法,将旧版本的大型二进制文件存储在存储库之外的位置(远程)并用指针文件替换它。如果需要旧版本,则客户端从远程获取它。因此,如果设计者从远程拉取最新状态,他只会下载最新状态和指针文件。
因此,只有当您有权访问位于启用 LFS 的服务器上的远程时,Git-LFS 才能变得更加方便。如果没有服务器将 blob 推送到,则 LFS 跟踪的 blob 将保留在本地存储库中,因此无法利用减少本地存储消耗的优势。
通常,远程是支持 LFS 的 git 提供程序,这对于某些项目来说可能太昂贵。但是,也有在本地托管 Git-LFS 远程的解决方案。
本质上,Git-LFS 只允许通过 HTTP 传输数据。因此,您需要一个单独的 Git-LFS 服务器来存储大文件。然而,本地托管没有“官方服务器”实现。但有一些非官方的方法(例如Git-LFS Folderstore)可以做到这一点。
Git-LFS 文件夹存储提供了一种在本地管理 Git-LFS 远程的方法。它可以在本地计算机和网络驱动器上运行。lfs-folderstore如果您使用的是 Mac OS X,则可以通过将 lfs-folderstore 可执行文件复制到/usr/local/bin然后进行设置:
# 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`
Run Code Online (Sandbox Code Playgroud)
"'如果您的远程路径包含空格,请使用。
您可以通过调用 Git 垃圾收集器来压缩 git 存储库的大小git gc。它不会强硬地触及 Git-LFS blob。
.git/lfs/objects/仅当 Blob 已被推送到远程并且包含 Blob 的提交早于最近(3 天)时,Git-LFS 才会从本地存储库中删除它们。如果您想手动执行此操作,请执行以下命令:
# 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
Run Code Online (Sandbox Code Playgroud)
虽然 Git 提交是存储库内容的完整“快照”,但它实际上并没有再次存储文件。Git 将文件内容存储为由内容校验和标识的“blob 对象”;只有内容、文件名和权限存储在树对象中。如果您提交对文件的更改,Git 会再次将整个文件(压缩)存储为一个新的 blob;任何未更改的文件将重用现有的 blob。如果您有两个内容相同的文件,它们将共享相同的 blob。
如果没有 git-lfs,每次提交对二进制文件的更改时,整个文件(压缩的)都必须再次存储在新的 blob 中。由于 Git 存储库是项目的完整历史记录,因此一段时间后这可能会占用大量磁盘空间。如果空间紧张,这可能对您很重要。
幸运的是,您不必现在就做出这个决定。如果存储库变得太大,您始终可以稍后使用 BFG Repo Cleaner 追溯应用 git-lfs。
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |