我试图更清楚地理解 .gitignore
语法,特别是就 https://github.com/github/gitignore gitignores 而言。
我看到前导斜杠仅用于匹配相对于 .gitignore
文件位置的路径名(来自 http://git-scm.com/docs/gitignore ):
但是当我删除前导斜杠时会发生什么?据我了解,有两种情况:
dir/
将匹配 <root>/dir
、 <root>/a/dir
、 <root>/a/b/c/.../dir
等,其中 <root>
等,其中 0x25181223131318131314313 的文件位置.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 忽略了这两个
.gitignore
目录。这与第 1 种情况一致:模式没有斜杠(结尾的除外),因此 Git 正在监视整个目录树,忽略与模式匹配的所有内容。第二次测试:
# .gitignore
/dir/
# git status
Untracked files:
src/
在这里,由于模式中的前导斜杠,Git 只忽略了根目录正下方的 0x25181231343141 目录。
第三次测试:
# .gitignore
dir/*
# git status
Untracked files:
src/
这与第 2 种情况一致:模式内部有一些斜杠,因此它被视为从根目录开始的路径名。
现在是真正的问题的时候了。让我们考虑 this gitignore file :例如,当他们忽略目录
dir
时,他们实际上是否忽略了在整个目录树中找到的每个 dir
目录?自从我之前看到 Git 的工作原理以来,这就是我一直在思考的问题。因此,如果我碰巧有一个自定义模块,其中包含一个
downloader/
目录,它会不会像 Magento 根目录中的常规模块一样被意外忽略?这是一个有点理所当然的问题,因为它实际上已经发生在我身上,产生了一个很难找到的错误。所以,在 Magento
downloader
文件(我只是作为一个例子,顺便说一句)中,很多模式都包含斜杠,所以它们与从根开始的路径名正确匹配,但有一些情况,比如 downloader
或 .gitignore
,如果我没记错的话,有潜在危险,可能应该改为 downloader/
和 errors/
。作为一个更普遍的问题,当我想从根显式地选择一个路径名而不将它用于包含斜杠的模式时,我是否应该始终将前导斜杠用于不包含斜杠的模式(尾随除外),或者我应该为了清楚起见,总是使用前导斜杠?你怎么看待这件事?
感谢您阅读并为长篇文章感到抱歉。
最佳答案
只是想总结一下以备将来可能的快速引用——前导斜杠将匹配 anchor 定到根。因此,在下面的示例中,如果没有斜线,通配符也将排除 foo 中的所有内容,因为它需要 *
并沿树递归向下移动。但是,对于 /*
,它排除了文件夹 foo 及其内容以外的所有内容:
$ cat .gitignore
/*
!/foo
关于git - 何时在 gitignore 中使用前导斜杠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24139478/