【问题标题】:How to .gitignore all files/folder in a folder, but not the folder itself? [duplicate]如何 .gitignore 文件夹中的所有文件/文件夹,而不是文件夹本身? [复制]
【发布时间】:2023-07-01 13:51:02
【问题描述】:

我想在我的 Git 存储库中签入一个空白文件夹。实际上,我需要忽略文件夹中的所有文件和文件夹,而不是文件夹本身。我怎样才能做到这一点?我应该在我的.gitignore 文件中添加什么内容?

对于那些想知道我为什么要这样做的人,我的存储库中有一个“上传”目录。我想提交空白目录,但没有所有内容。

【问题讨论】:

  • 我有完全相同的东西。刚刚添加了一个 README 文件,说明这是上传目录,git 理解它:)
  • 你几乎已经回答了你自己的问题:把一个 .gitignore 写着“忽略一切”放到那个文件夹中;这是 mipadi 的答案。
  • 这对于将空的构建文件夹放入 git 很有用。构建文件夹中的内容无需签入
  • 我仍然无法相信 Git 没有办法正确地做到这一点。 SVN 可以做到。
  • 我知道这已被标记为重复,但只是为了完整性和将来阅读此内容的人:Git does not version folders。典型的解决方法是在要版本化的文件夹中包含 .gitkeep.keep 文件。

标签: git gitignore


【解决方案1】:

你不能在 git 中提交空文件夹。如果你想让它显示出来,你需要在里面放一些东西,即使只是一个空文件。

例如,将一个名为.gitkeep 的空文件添加到您要保留的文件夹中,然后在您的.gitignore 文件中写入:

# exclude everything
somefolder/*

# exception to the rule
!somefolder/.gitkeep 

提交您的 .gitignore.gitkeep 文件,这应该可以解决您的问题。

【讨论】:

  • 没有--bare 选项吗?
  • 最好的方法是 Trianam 上面列出的。在目录中包含一个 .gitignore 文件。这个 .gitignore 应该忽略该目录 (*) 中的所有文件,除了它自己 (!.gitignore)。
  • 仅提交和清空文件夹并不能解决确保该文件夹中的文件永远不会被跟踪的问题。最好使用 .gitignore 文件,如下所示的@Trianam。
  • @LeandroAlves 在每个目录中创建一个 .gitignore 文件根本是不好的做法......
  • 是否有理由将somefolder/(不带星号)放入 .gitignore 会覆盖以后的否定并且不会包含 .gitkeep?
【解决方案2】:

将此.gitignore 放入文件夹,然后将git add .gitignore

*
*/
!.gitignore

* 行告诉 git 忽略文件夹中的所有文件,但 !.gitignore 告诉 git 仍然包含 .gitignore 文件。这样,您的本地存储库和该存储库的任何其他克隆都将获得空文件夹和所需的 .gitignore

编辑:可能很明显,但也可以将 */ 添加到 .gitignore 以忽略子文件夹。

【讨论】:

  • 忽略目录*/ 是不必要的,因为* 也包括目录。
  • NB «如果该文件的父目录被排除,则无法重新包含该文件。»
  • @TimofeyGorshkov 上述观点的解决方法:* ; !dir/ ; dir/* ; !dir/reincludefile
  • 需要注意的是,第二个.gitignore 不需要命名。只要文件的内容包含!filename,任何filename 都可以。我之所以提到这一点,是因为我们认为拥有一个用于保存目录的 .gitignore 文件似乎具有误导性和不明确性。
  • 这应该是公认的解决方案。