如何可靠地检查git是否忽略了文件?

时间:2017-07-20 09:31:59

标签: git bash gitignore

我遇到的问题是git check-ignore不尊重.gitignore的'不'(!)规则。如果文件与.gitignore文件中的任何条目匹配,它将返回“Ignored”,无论该条目是否告诉它不要忽略该路径(通过!运算符)

git check-ignore's documentation表示返回代码映射如下:

  

退出状态

     
      
  • 0 :忽略一个或多个提供的路径。
  •   
  • 1 :不会忽略所提供的路径。
  •   
  • 128 :遇到致命错误。
  •   

这与我在添加“请勿忽略”规则时所看到的情况不符,即在条目前粘贴!

举个例子,让我们按如下方式创建一个文件结构:

.gitignore
files/
    path-not-ignored
ignored-files/
    path-ignored
    path-not-ignored

.gitignore包含:

ignored-files/*
!ignored-files/path-not-ignored

根据文档,我希望files/ignored-files/path-not-ignored中的文件返回退出状态1(不会被忽略),ignored-files/path-is-ignored返回0(忽略)。< / p>

我看到的是ignored-files中返回退出状态0(忽略)的所有内容:

File                             | Expected exit status | Actual exit status | Summary
-------------------------------- | -------------------- | ------------------ | -------
`files/path-not-ignored`         | 1 (Not ignored)      | 1 (Not ignored)    | Expected
`ignored-files/path-ignored`     | 0 (Ignored)          | 0 (Ignored)        | Expected
`ignored-files/path-not-ignored` | 1 (Not ignored)      | 0 (Ignored)        | Unexpected

(正在使用git check-ignore <file>;echo $?

检查退出状态代码

这与Git的内部行为不符,因为我可以git add add ignored-files/path-not-ignored就好了:

File                             | `git add`?                   | Matches `git check-ignore` output?
-------------------------------- | ---------------------------- | ----------------------------------
`files/path-not-ignored`         | Adds file (as expected)      | Yes
`ignored-files/path-ignored`     | Throws warning (as expected) | Yes
`ignored-files/path-not-ignored` | Adds file (as expected)      | No


git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   files/path-not-ignored
    new file:   ignored-files/path-not-ignored

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .gitignore

由于git check-ignore在这种情况下不可靠,是否还有其他命令可用于检查Git是否忽略/不忽略给定文件?

返回退出代码的东西是理想的,因为我在bash脚本中使用它。

1 个答案:

答案 0 :(得分:0)

从2017年7月开始使用Git 2.18(2018年7月)检查问题是否仍然存在。

Commit d60771e可能有助于消除误报。

  

check-ignore:修复目录和其他文件类型的混合

     

check_ignore()中,第一个pathspec项确定任何对象的dtype。   随后的。
  这意味着,与常规文件匹配的pathspec可以防止在匹配目录时遵循以下pathspec,这毫无意义。