我有一个第三方库需要作为工作空间的目录结构,所以我希望在我的仓库中存在该文件结构。但是,如果这些目录中有任何临时文件,我绝不想实际提交它们。
所以,例如,我可能有:
/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
个文件。我做错了什么?
答案 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添加文件。这将允许您获得所需的目录结构,同时避免在这些目录中跟踪未来的内容。