模拟 git status --ignored 在非存储库文件夹中

模拟 git status --ignored 在非存储库文件夹中

这本质上可能是重复的这个问题,但是据我所知,提供的 perl 脚本在我的情况下不起作用。关于查找多个模式也存在很多问题,但搜索起来却出人意料地困难,因为谷歌似乎没有区分“模式文件”和“文件名模式”。

我想效仿

git status --ignored --porcelain | awk '{print $2}'

在非存储库文件夹中。那是,我想列出与(指定)文件中列出的模式匹配的文件和目录,并具有以下约束

  • 模式是用gitignore 语法,特别是空行和注释应该被脚本忽略;
  • 脚本应该从当前工作目录开始;
  • 该脚本应该不是走进匹配的目录(即,匹配始终是叶子),或进入符号链接。

这是一个简单的例子:

$> cat .gitignore 
    *.DS_Store*
    tmp/
    a/**/foo

$> tree -a .
.
|-- .DS_store
|-- .gitignore
|-- a
|   |-- b
|   |   |-- foo
|   |   |   `-- file
|   |   `-- tmp
|   |-- foo
|   `-- tmp
|       `-- file
`-- c
    |-- .DS_Store?
    `-- foo

5 directories, 8 files

$> git status --ignored --porcelain | awk '{print $2}'
    .DS_store
    a/b/foo/
    a/foo
    a/tmp/
    c/.DS_Store?

如果可能的话,我对既可以在 osx 也可以在 linux 上运行的解决方案特别感兴趣,并且可以扩展以考虑 posix-egrep 格式的模式。对于最后一部分,类似的东西find . -print | egrep -f patternfile可以工作,尽管这会进入匹配的目录,这可能会使事情变得非常慢。

相关内容