TL; DR:我希望子模块忽略某些文件,但我希望父项目跟踪这些文件
详情
这是针对Unity项目的。我想在子模块中添加一堆经常使用的代码和资产,因此我可以在项目之间轻松共享。
问题是Unity需要跟踪" .meta"存储在每个资产中的文件。这些.meta文件对于每个项目都是唯一的,因此它们不能通过子模块共享。
所以,我在子模块中添加了一个.gitignore文件,告诉它不要跟踪.meta文件
到目前为止事情按计划进行了。我将子模块添加到项目中,它正确地忽略了项目的元文件。但是,虽然我需要将它们提交到主git存储库中,但子模块下的任何内容都会被忽略,因此我无法将元文件添加到主存储库中。
示例:
Assets
L Game Files
L some_asset.jpg
L some_asset.jpg.meta
L Submodule
L shared_asset.jpg
L shared_asset.jpg.meta
在这种情况下,我希望主要的git存储库跟踪:
Assets
L Game Files
L some_asset.jpg
L some_asset.jpg.meta
L Submodule
L shared_asset.jpg.meta
子模块:
shared_asset.jpg
我梳理了网络,我尝试了不同的.gitignore组合,但没有任何效果。我开始认为这可能是不可能的,但如果有人有任何想法,我会非常感激!
提前致谢!
答案 0 :(得分:1)
摘要:Export Unity packages而不是使用git子模块。
他们在您的父项目中被“忽略”的原因不是因为您的gitignore,而是因为子模块仅仅是对存储库上的提交的引用,而不是存储库的分支。换句话说,如果您希望子模块作为项目中的目录,则无法在未提交到子模块存储库的情况下向其添加元文件,因为整个目录位于不同的存储库中。您可以为每个Unity项目专门创建子模块的分支,但这很快就会变得混乱和不方便。
相反,您应该使用自定义Unity包。将子模块存储库导出为Unity中的包,然后在有新的Unity项目时打开包.Unity会将文件复制到新项目中并添加相应的元文件。如果要使用上游资产覆盖新项目的资产,可以在将来重新导入程序包的更新版本。请参阅Unity手册中的Exporting Packages。
答案 1 :(得分:0)
一个技巧是在您的子模块库中注册(.gitattributes
declaration) content filter driver 。
(来自“Customizing Git - Git Attributes”的图片,来自“Pro Git book”)
与smudge
关联的*.jpg
脚本会通过查看父预先约定的路径生成(自动在git chekcout
上)元文件(例如../meta/myfile.jpg.meta
)在父仓库中找到(并跟踪)。
生成的实际元文件仍然被忽略(.gitignore
)
这意味着你的子模块的实际工作树不会“脏”
您的父级仓库会跟踪这些元文件。
请参阅“git smudge/clean filter between branches”的完整示例。