首页 文章

没有双星,gitignore模式不起作用

提问于
浏览
0

此模式正常工作:

**/Assets/Plugins/Editor/JetBrains*

但这种模式不会:

Assets/Plugins/Editor/JetBrains*

据我所知,这两种模式是等价的 . 这可能是什么问题?

2 回答

  • 6

    据我所知,这两种模式是等价的 .

    他们不是 .

    Git有一个记录不清的偷偷摸摸的功能(错误?烦恼?不管你喜欢什么,尽管它的意思是一个功能),其中 .gitignore 文件中的glob模式有时会被锚定或生根 - 它不清楚在这里使用什么词 - 有时候不是 . 我认为最好用例子来解释 .

    假设您有以下文件:

    /a
    /b
    /dir/a
    /dir/b
    /dir/sub/a
    /dir/sub/b
    

    也就是说,顶级目录有两个文件 ab ,以及一个目录 dir . 在 dir 里面有两个文件 ab ,另一个目录是 sub ,在最后一个文件中有两个文件 ab .

    .gitignore 中列出 a 意味着忽略所有名为 a 的文件,1这样就覆盖了六个文件中的三个 .

    但是,在 .gitignore 中列出 /a 表示仅在顶级忽略名为 a 的文件,即忽略一个文件 .

    除了触发此功能的结尾之外的任何位置都存在斜杠,因此在顶级文件中列出 dir/a 意味着仅忽略 dir 目录中名为 a 的文件,即仅 /dir/a . 如果我们创建了一个新文件 dir/sub/dir/a ,那将不会被忽略: dir/a 表示与 /dir/a 相同 .

    人们可能期望只有一个领先的斜线才能做到这一点,但事实上,除了最后,它是任何斜线,这样做 . 末尾部分的除外意味着如果你在 .gitignore 的顶级列出 sub/ ,Git将忽略 dir/sub 中的两个文件,因为在应用"contains a slash"规则之前从末尾删除了斜杠,然后将"matches a directory"规则放回到最后 .

    结果是,如果您想在任何级别忽略 Assets/Plugins/Editor/JetBrains* - 而不仅仅是当前级别(此特定 .gitignore 文件位于工作树中的任何位置) - 您需要 **/ 前缀 .

    请注意,您可以在每个级别拥有 .gitignore 文件,因此您可以只找到名为 Editor 的目录,如果它们位于包含 Assets/Plugins/ 的目录中,请在此处创建 .gitignore 列出 JetBrains* . 这与在顶层编写 **/Assets/Plugins/Editor/JetBrains* 具有相同的效果 .


    1Ignore真的是错误的动词 . 一个已经跟踪过的文件已被追踪;在 .gitignore 中列出文件意味着不要追踪,并且不要使用en-masse "add all files"命令自动添加它 . 它还授予Git在某些情况下破坏文件的权限 . 但调用文件 .git-dont-complain-about-untracked-and-dont-auto-add-and-sometimes-feel-free-to-clobber-these-files 将是非常不利的,所以我们说"ignore" ...

  • 1

    **/Assets/Plugins/Editor/JetBrains*
    将忽略路径无关紧要资产的根文件夹是什么意味着它可以嵌套 .

    Assets/Plugins/Editor/JetBrains*
    将忽略 the current 文件夹中的路径statring

    **/ 表示它可以在当前路径位置下的任何文件夹中"nested"

相关问题