在git中维护一个空目录结构,忽略其中的任何文件

时间:2015-10-28 17:00:40

标签: git

我有一个第三方库需要作为工作空间的目录结构,所以我希望在我的仓库中存在该文件结构。但是,如果这些目录中有任何临时文件,我绝不想实际提交它们。

所以,例如,我可能有:

/data
|----/dir1
|----/dir2
     |----/dir3

并且程序成功运行需要存在这些目录,但我不想意外提交5GB的临时数据文件或类似内容。

所以,我所做的是在.gitignore目录的根目录添加/data,其中包含以下内容:

*
!*.gitignore
!*.keep

这个想法是它会忽略当前和所有子目录中的所有内容,除了以.gitignore.keep结尾的任何文件

然后我在每个目录中添加.keep

/data
.gitignore
|----/dir1
     .keep
|----/dir2
     .keep
     |----/dir3
          .keep

然后我运行git add --all以获得良好的衡量标准,并运行git commit

结果:

new file:   data/.gitignore

但忽略了所有.keep个文件。我做错了什么?

2 个答案:

答案 0 :(得分:3)

你正在与此发生冲突(来自gitignore)。

  

如果排除该文件的父目录,则无法重新包含文件。出于性能原因,Git不会列出排除的目录,因此无论在何处定义文件,所包含文件的任何模式都无效。

我不知道如何在Git中解决它。

但是,这表明您的程序非常脆弱。您的程序应该足够强大,可以自己创建这些目录。或者,您的构建系统应该创建它们。

答案 1 :(得分:3)

不是将模式添加到项目目录结构根目录的.gitignore文件中,而是在每个子目录下添加.keep文件,以便Git添加目录结构本身,我建议在每个子目录中添加一个单独的.gitignore文件,而不是项目根目录。

您的.gitignore文件将如下所示:

# ignore everything in the current dir
*

# except this file
!.gitignore

您需要仔细使用这些内容并在特定的(子)目录中忽略所有内容,而不必使用其他扩展。请注意,您仍然可以使用自己的一组模式将.gitignore文件保留在项目的根目录中。请注意潜在的冲突。

您的结构如下所示:

/data
|----/dir1
     .gitignore
|----/dir2
     .gitignore
     |----/dir3
          .gitignore

解决方法:git add -f <filename>

如上所述,如果所有.gitignore文件都有*通配符并且设置为忽略所有内容,Git会将这些设置应用于子目录。在上面的示例中,由于dir3/.gitignore中的通配符,git add永远不会处理dir2/.gitignore文件。

解决此问题的一种可能方法是强制 Git在子目录中添加.gitignore个文件。

在上面的示例中,您可以使用git add -f dir2/dir3/.gitignore强制Git添加文件。这将允许您获得所需的目录结构,同时避免在这些目录中跟踪未来的内容。

相关问题