git - 何时在 gitignore 中使用前导斜杠

标签 git gitignore

我试图更清楚地理解 .gitignore语法,特别是 https://github.com/github/gitignore gitignores 很关心。

我看到前导斜杠仅用于匹配相对于 .gitignore 位置的路径名文件(来自 http://git-scm.com/docs/gitignore ):

A leading slash matches the beginning of the pathname. For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c".

但是当我删除前导斜杠时会发生什么?据我了解,有两种情况:

  1. 如果模式不包含斜杠(或者只包含尾部斜杠,这意味着它应该匹配目录),则在整个目录树中执行搜索。例如,模式 dir/将匹配 <root>/dir , <root>/a/dir , <root>/a/b/c/.../dir等,其中 <root>.gitignore 的位置文件。
  2. 如果模式包含一个斜杠,它不在尾部位置(它不是最后一个字符),那么它只与相对于 .gitignore 的路径名匹配。文件位置。

这些是我用来检查这种行为的例子:

# Directory structure:
<root>
├─ dir/
│   └─ test
├─ src/
│   ├─ dir/
│   │   └─ test
test file is there only because Git does not track empty directories.

第一次测试:

# .gitignore
dir/

# git status
nothing to commit

所以 Git 忽略了 dir目录。这与案例 1 一致:模式没有斜杠(尾部斜杠除外),因此 Git 正在监视整个目录树,忽略与模式匹配的所有内容。

第二次测试:

# .gitignore
/dir/

# git status
Untracked files:
    src/

在这里,Git 只忽略了 dir由于模式中的前导斜杠,直接位于根目录下的目录。

第三个测试:

# .gitignore
dir/*

# git status
Untracked files:
    src/

这与案例 2 一致:该模式内部有一些斜线,因此它被认为是从根目录开始的路径名。

现在是真正的问题了。让我们考虑 this gitignore file : 当他们忽略目录时 downloader/ ,例如,他们不是真的忽略了每一个downloader吗?在整个目录树中找到的目录?自从我之前看到 Git 的工作原理以来,这就是我的想法。

所以如果我碰巧有一个带有 downloader 的自定义模块它里面的目录,它会像Magento根目录中的常规目录一样被意外忽略吗?这是一个有点反逻辑的问题,因为它实际上已经发生在我身上,产生了一个很难找到的错误。

所以,在 Magento .gitignore文件(顺便说一句,我只是作为一个例子提到的)很多模式都包含斜线,所以它们与从根开始的路径名正确匹配,但也有一些情况,比如 downloader/errors/那,如果我没记错的话,是有潜在危险的,应该改为 /downloader//errors/ .

作为一个更一般的问题,当我想选择一个从根开始的路径名时,我是否应该始终对不包含斜杠的模式使用前导斜杠(尾随的斜杠除外),而不是将它用于包含斜杠的模式,还是为了清晰起见,我应该始终使用前导斜线?你怎么看?

感谢您的阅读,抱歉文章太长。

最佳答案

只是想总结一下以供将来可能的快速引用——前导斜线将匹配锚定到根。因此,在下面的示例中,如果没有斜线,通配符也会排除 foo 中的所有内容,因为它会采用 * 并递归地向下移动到树中。但是,对于 /*,它排除了文件夹 foo 及其内容以外的所有内容:

$ cat .gitignore
/*
!/foo

关于git - 何时在 gitignore 中使用前导斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24139478/

相关文章:

Gitignore 错误地排除了子文件

Git 忽略父目录中的 .gitignore 文件

android - Glide Process 'command ' git'' 以非零退出值 128 完成

windows - Git:请告诉我你是谁

git - Netbeans 和 Git,忽略 .obj 文件

eclipse - gitignore 不会忽略我的 .settings/directory(由 eclipse 创建)

r - 无法在 R-Studio 上实现 git 版本控制(版本控制系统 : NONE)

git - 我如何生成自上次 pull 以来发生的变化的 git diff?

java - 将 .jar 文件添加到 git 存储库中

git - 为什么 .gitignore 中的目录仍然被 "git status"跟踪?