首页 > 解决方案 > 如何使用 Git LFS 跟踪存储库的任何子目录中的任何(任意)文件 - 但不跟踪其根目录中的任何文件?

问题描述

我已经搜索了多天以找到解决方案,并且做了很多试错游戏,但都没有成功。

这个想法只是为大量二进制(和所有相关)文件创建一个库存储库,这本质上可以 100% 确保任何用户将来添加的任何文件都会被 lfs 跟踪。

但是,根目录中的 .gitattributes、.gitignore、README.md 等文件当然应该被排除在外。

要了解.gitignore的通配符规则,已经需要博士学位,.gitattributes文档提到了另外两个例外(例如禁止否定),我找不到任何关于 Git LFS 是否遵循这些“讨厌的规则”的有用信息。

可能已经有一些相关的问题/答案,但到目前为止我找不到任何对我的问题有用的东西。

任何帮助深表感谢。提前致谢!

编辑: 我已经测试了诸如*/*, */*.*, */**, **/*, **/**, /**/*, ... 之类的模式,lfs track "{pattern}"但有时(取决于工作树状态)这些通配符模式会被转换为 .gitattributes 中命名文件分数的巨大未排序列表(没有 shell 扩展)。但是,如果通配符保留在 .gitattributes 中,则会发生奇怪的事情,例如合并后不再跟踪新匹配的文件,或者抱怨应该是指针的文件,列出的文件git lfs status突然消失......我还应该提到git lfs migrate import总是呈现通配符在 .gitattributes 到完全无用的现有文件列表中。和类似的东西git lfs migrate --include="{pattern}"被默默地忽略,似乎只跟踪几个任意选择的文件扩展名!?我什至设法让存储库处于可以推送到远程而没有任何错误的状态,然后服务器上的所有文件都丢失了 - 难以置信。在我看来,Git LFS 似乎完全不可靠且不可预测。但也许我做错了什么。

顺便说一句,这是我的测试中的一些版本信息,并且 Git LFS 已安装 gloablly:

标签: gitgit-lfs

解决方案


我必须为遗留系统做一些非常相似的事情。这是我发现的有效方法:忽略所有内容,然后有选择地取消忽略。每个父目录必须单独取消忽略,然后才能取消忽略其子目录。

假设您只想存储 /bin、/sbin 和 /usr/local/bin。

# Ignore everything
*

# Unignore .gitignore so we can commit it.
!.gitignore

# Unignore /bin and its contents
!bin/
!bin/**
!sbin/
!sbin/**

# Unignore /usr/local/bin and its contents
!usr/
!usr/local/
!usr/local/bin/
!usr/local/bin/**

# Reignore log, lock and tmp files.
*.lock
*.log
.#*
*~
.*.swp

这个想法只是为大量二进制(和所有相关)文件创建一个库存储库,这本质上可以 100% 确保任何用户将来添加的任何文件都会被 lfs 跟踪。

Git 和 Git LFS 都不是合适的解决方案。他们不是发布经理。Git LFS 增加了不必要的复杂性,对于像可执行文件这样的小型二进制文件,它是不必要的。

我这样做是作为权宜之计的解决方案。我得到了一个完全不受控制的遗留系统,生产文件正在现场编辑;总比没有好,但它很烂。应该尽快找到更好的解决方案。

就我而言,我逐渐用托管服务器、打包软件、依赖管理、单独的代码存储库和适当的发布管道替换了它的功能。然后我停用了旧版服务器。我建议您也仅将其用作权宜之计并研究适当的解决方案。

另一种权宜之计是使用备份软件进行增量备份。仅二进制存储库的“历史”并不是特别有用。


推荐阅读