.gitignore 只跟踪目录中任何深度的一个文件

.gitignore track only one file in a directory at any depth

我试图忽略命名目录中可能位于任何深度的单个文件以外的所有文件。所以在这样的结构中,我想跟踪 build/.gitkeep 的任何出现,但忽略 build/ 中和下面的所有其他文件。要跟踪的项目标有 ++。要忽略的项目标有 --.

    |.gitignore                               ++
    |Makefile                                 ++
    |--build/                                 ++
    |--build/.gitkeep                         ++
    |--build/ignore_any_file                  --
    |--build/ignore_any/dir                   --
    |--foo/                                   ++
    |--foo/file_to_keep                       ++
    |--foo/dir_to_keep/                       ++
    |--foo/dir_to_keep/stuff                  ++
    |--foo/build/                             ++
    |--foo/build/.gitkeep                     ++
    |--foo/build/ignore_any_file              --
    |--foo/build/ignore_any/dir               --
    |--foo/build/ignore_any/dir/subir         --
    |--bar                                    ++
    |--bar/file_to_keep                       ++
    |--bar/dir_to_keep/                       ++
    |--bar/dir_to_keep/stuff                  ++
    |--bar/build/                             ++
    |--bar/build/.gitkeep                     ++
    |--bar/ignore_any_file                    --
    |--bar/ignore_any/dir                     --
    |--bar/ignore_any/dir/subir               --
    |--foobar/foo                             ++
    |--foobar/foo/file_to_keep                ++
    |--foobar/foo/dir_to_keep/                ++
    |--foobar/foo/dir_to_keep/stuff           ++
    |--foobar/foo/build/                      ++
    |--foobar/foo/build/.gitkeep              ++
    |--foobar/foo/build/ignore_any_file       --
    |--foobar/foo/build/ignore_any/dir        --
    |--foobar/foo/build/ignore_any/dir/subir  --

我试过很多很多组合。对我来说,关键点似乎是在任何深度进行构建。我试图避免为每个存在 build/ 的路径创建条目。我也不想在 build/.

的每个实例中创建 .gitignore 文件
    $ git --version
    git version 2.20.1

您应该确保从您的忽略规则中排除 文件夹,如果您希望能够排除文件:

build/**
!build/**/
!build/**/.gitkeep

这是因为:

It is not possible to re-include a file if a parent directory of that file is excluded

在你的情况下(在任何深度建造)

**
!**/
!build/.gitkeep
!**/build/.gitkeep

OP nelsonov made it work () 与:

build/** 
!build/**/ 
!build/ 
!build/.gitkeep 
!**/build/ 
!**/build/.gitkeep 
**/build/**