如何编写 .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
文件,以便只有以下文件包含在我的提交中:
.yml
和 .yaml
个文件
.gitattributes
.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
.
中忽略的文件
届时,您可以按预期提交代码。
我有一个包含以下内容的目录:
.
├── .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
文件,以便只有以下文件包含在我的提交中:
.yml
和.yaml
个文件.gitattributes
.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
.
届时,您可以按预期提交代码。