如何忽略 git 存储库子目录中除单个文件外的所有内容?

How can I ignore everything in a git repository subdirectory except a single file?

我有一个存储库,其中包含一个名为 mod/ 的子目录。我希望这个子目录连同其中的 README 文件一起包含在存储库中,但我不希望包含 mod/ 中的其他子目录。我已经尝试了几个 here 使用 .gitignore 提出的修复并提交更改,但 git status 仍然显示 mod/ 中的所有内容都被跟踪。目前,我的 .gitignore 包含:

mod/* # Ignore everything in 'mod'...
!mod/README.md # ... except this.

但我也试过将第一行设置为:

/mod
mod/
./mod
./mod/*

和其他一些变体...

为了'apply'这些设置我每次编辑.gitignore,我运行:

git rm -r --cached .  
git add .gitignore
git add mod/README.md
git commit -m "banging my head on the wall"
git status

并且状态继续显示 mod/ 中未跟踪的文件。

没有必要例外。忽略整个目录(mod/*)然后

git add -f mod/README.md
git commit

-f 告诉 git 覆盖这个文件的忽略。 git 将继续跟踪它,而忽略其他所有内容。

这是可行的,因为 .gitignore 仅决定 git 如何处理 未跟踪的 文件。如果您强制 git 跟踪带有 -f 的文件,它在忽略文件中的事实是无关紧要的。

我可以想到三个直观的选项:

  1. 添加一个单独的.gitignoremod:

    *
    !README.md
    
  2. 使用您的根级别 .gitignore,每行仅 规则或评论,但不能同时使用:

    ./mod/*
    !./mod/README.md
    

    我在这里使用./前缀来强调,但这并不是绝对必要的。由于路径都包含一个非尾部斜杠,因此它们将被解释为相对于 .gitignore 的目录,而不管。

  3. 不要使用 .gitignore 作为肯定规则:忽略 mod,然后使用

    git add -f mod/README.md
    

    Git 持续跟踪使用 -f/--force 标志添加的任何文件。