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

3

我试图忽略命名目录中除一个指定文件外的所有文件,这个目录可能在任何深度上。所以,在像这样的结构中,我想跟踪任何出现在 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
1个回答

5

如果你想要排除一个文件,你需要确保从忽略规则中排除文件夹

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

这是因为: 如果文件的父目录被排除,就无法重新包含该文件 在您的情况下(在任何深度构建)。
**
!**/
!build/.gitkeep
!**/build/.gitkeep

OP nelsonov在评论中使用以下方法使其正常工作:点击此处

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

@nelsonov 你的 .gitignore 文件在哪里?我刚刚测试了一下,它完美地工作了。即使包含了 .gitkeep,也不会检测到任何较低级别的 build 文件夹。你使用的是哪个版本的 Git?在哪个操作系统上? - VonC
@nelsonov 好的,我的第二个配置只跟踪.gitkeeps在主要的build/文件夹中,而不是任何build/子文件夹中的.gitkeep - VonC
我不知道该怎么办。我仍然看到上面指示的结果。顺便说一下,在build下不会有一个build实例,但这并不重要。我仍然看到path/build/filepath/build/dir/未被跟踪。它确实忽略了path/build/dir/anything。顺便说一句,.gitkeep的整个目的只是为了保持模板中否则为空的build/path/build - nelsonov
@nelsonov 我已经进一步编辑了答案末尾的规则:再试一次。 - VonC
@nelsonov 感谢您的反馈:我已将您的评论包含在答案中,以增加其可见性。 - VonC
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接