.gitignore 仅跟踪目录中任意深度的一个文件

nel*_*nov 3 git gitignore

我试图忽略命名目录中可能位于任何深度的除单个文件之外的所有文件。因此,在这样的结构中,我想跟踪 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  --
Run Code Online (Sandbox Code Playgroud)

我尝试过很多很多组合。对我来说,关键点似乎是在任何深度都有 build/ 。我试图避免为 build/ 存在的每个路径创建条目。我也不想在 build/ 的每个实例中创建 .gitignore 文件。

    $ git --version
    git version 2.20.1
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 5

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

build/**
!build/**/
!build/**/.gitkeep
Run Code Online (Sandbox Code Playgroud)

这是因为:

如果排除该文件的父目录,则无法重新包含该文件

根据您的情况(在任何深度构建)

**
!**/
!build/.gitkeep
!**/build/.gitkeep
Run Code Online (Sandbox Code Playgroud)

OP nelsonov使其工作(在评论中):

build/** 
!build/**/ 
!build/ 
!build/.gitkeep 
!**/build/ 
!**/build/.gitkeep 
**/build/**
Run Code Online (Sandbox Code Playgroud)