添加git子模块忽略的文件

时间:2017-12-02 01:56:13

标签: git unity3d git-submodules gitignore

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组合,但没有任何效果。我开始认为这可能是不可能的,但如果有人有任何想法,我会非常感激!

提前致谢!

2 个答案:

答案 0 :(得分:1)

摘要Export Unity packages而不是使用git子模块。

他们在您的父项目中被“忽略”的原因不是因为您的gitignore,而是因为子模块仅仅是对存储库上的提交的引用,而不是存储库的分支。换句话说,如果您希望子模块作为项目中的目录,则无法在未提交到子模块存储库的情况下向其添加元文件,因为整个目录位于不同的存储库中。您可以为每个Unity项目专门创建子模块的分支,但这很快就会变得混乱和不方便。

相反,您应该使用自定义Unity包。将子模块存储库导出为Unity中的包,然后在有新的Unity项目时打开包.Unity会将文件复制到新项目中并添加相应的元文件。如果要使用上游资产覆盖新项目的资产,可以在将来重新导入程序包的更新版本。请参阅Unity手册中的Exporting Packages

答案 1 :(得分:0)

一个技巧是在您的子模块库中注册(.gitattributes declaration content filter driver

smudge (来自“Customizing Git - Git Attributes”的图片,来自“Pro Git book”)

smudge关联的*.jpg脚本会通过查看父预先约定的路径生成(自动在git chekcout上)元文件(例如../meta/myfile.jpg.meta )在父仓库中找到(并跟踪)。 生成的实际元文件仍然被忽略(.gitignore) 这意味着你的子模块的实际工作树不会“脏” 您的父级仓库会跟踪这些元文件。

请参阅“git smudge/clean filter between branches”的完整示例。