如何编写 .gitignore 使其只包含 YAML 文件和一些特定文件?

How to write .gitignore so that it only includes YAML files and some specific files?

我有一个包含以下内容的目录:

.
├── .gitattributes
├── .gitignore
├── .gitignore.bak
├── coding_init.bat
├── config
│   ├── config
│   │   └── default.yml
│   └── match
│       ├── base.yml
│       └── packages
├── init.bat
├── mykey
├── packages
│   └── a.txt
├── r.bat
├── reset.bat
├── run_github.bat
└── runtime
    ├── disabledv2.ico
    ├── espanso-daemon.lock
    ├── espanso-worker.lock
    ├── espanso.lock
    ├── espanso.log
    ├── formv2.ico
    ├── icon_no_backgroundv2.png
    ├── iconv2.png
    ├── kvs
    │   ├── has_completed_wizard
    │   ├── has_displayed_welcome
    │   └── has_selected_auto_start_option
    ├── normalv2.ico
    ├── search.png
    ├── tray_explain_image.png
    └── wizardv2.ico

我想创建一个 .gitignore 文件,以便只有以下文件包含在我的提交中:

所以只有这些文件应该进入我的提交:

.gitattributes
.gitignore
config/config/default.yml
config/match/base.yml

我已经阅读了 git 关于 .gitignore 的文档,但我仍然无法让它工作。我正在使用 git version 2.34.0.windows.1。 以下是我试过的。

C:\test>type .gitignore
*
!*/
!*.yaml
!*.yml
!.gitignore
!.gitattributes
C:\test>git add * && git commit -m "Auto commit"
[master (root-commit) 3bfab66] Auto commit
 17 files changed, 10 insertions(+)
 create mode 100644 .gitattributes
 create mode 100644 .gitignore
 create mode 100644 config/config/default.yml
 create mode 100644 config/match/base.yml
 create mode 100644 packages/a.txt
 create mode 100644 runtime/disabledv2.ico
 create mode 100644 runtime/espanso-daemon.lock
 create mode 100644 runtime/espanso-worker.lock
 create mode 100644 runtime/espanso.lock
 create mode 100644 runtime/espanso.log
 create mode 100644 runtime/formv2.ico
 create mode 100644 runtime/icon_no_backgroundv2.png
 create mode 100644 runtime/iconv2.png
 create mode 100644 runtime/normalv2.ico
 create mode 100644 runtime/search.png
 create mode 100644 runtime/tray_explain_image.png
 create mode 100644 runtime/wizardv2.ico

C:\test>

更新

我创建了一个录音来说明我的问题。

更新 2

C:\kj>type .gitignore
# Ignore everything by default
*

# Don't ignore directories (so we can look inside them, for other files)
!*/

# Don't ignore these
!*.yaml
!*.yml
!.gitattributes
!.gitignore
C:\kj>
C:\kj>rm -rf .git
C:\kj>git init
Initialized empty Git repository in C:/kj/.git/

C:\kj>git add . --dry-run
add '.gitattributes'
add '.gitignore'
add 'config/config/default.yml'
add 'config/match/base.yml'
add 'runtime/disabledv2.ico'
add 'runtime/espanso-daemon.lock'
add 'runtime/espanso-worker.lock'
add 'runtime/espanso.lock'
add 'runtime/espanso.log'
add 'runtime/formv2.ico'
add 'runtime/icon_no_backgroundv2.png'
add 'runtime/iconv2.png'
add 'runtime/normalv2.ico'
add 'runtime/search.png'
add 'runtime/tray_explain_image.png'
add 'runtime/wizardv2.ico'

C:\kj>
C:\kj>rm -rf .git
C:\kj>git init
Initialized empty Git repository in C:/kj/.git/

C:\kj>git add \*.yml .gitattributes .gitignore --dry-run
fatal: \*.yml: '\*.yml' is outside repository at 'C:/kj'

C:\kj>git add *.yml .gitattributes .gitignore --dry-run
add '.gitattributes'
add '.gitignore'
add 'config/config/default.yml'
add 'config/match/base.yml'

C:\kj>

你搞反了。您的 .gitignore 说明要忽略的内容。当你在那里有 !*.yaml 时,你是在说不要忽略 *.yaml 文件。

去掉 ! 你应该没问题。

你的git忽略看起来像这样:

# Ignore everything by default
*

# Don't ignore directories (so we can look inside them, for other files)
!*/

# Don't ignore these
!*.yaml
!*.yml
!.gitattributes
!.gitignore

不要在这里使用 glob 模式

要自动添加未跟踪的文件,请使用 git add --all。不要使用 git add *。这是一个全局模式。它由您的 shell 解释,而不是由 git 解释,因此它不知道 git 忽略的是什么或不是什么。

glob 模式会发生什么?

shell 将 git add * 扩展为 git add coding_init.bat config init.bat mykey packages r.bat reset.bat run_github.bat runtime,从 git 的角度来看,您似乎在说“无论如何添加这些文件,即使我据说要忽略它们

在我的系统上,git 实际上检测到您正在尝试添加被忽略的文件:

但是您的系统可能关闭了此选项。

这里不需要 glob 模式

如前所述,git add --all 将执行您想要的操作,它只会添加未在您的 .gitignore.

中忽略的文件

届时,您可以按预期提交代码。