Git:列出子目录中根目录的过滤路径

麦克杰森

git diff 可以列出两个修订之间的所有文件差异:

$ git diff --name-only master
foo.txt
bar/bar.txt
bar/baz.qux

它接受<path>glob模式形式的可选过滤器,该过滤器命名路径包括:

$ git diff --name-only master -- '*.txt'
foo.txt
bar/bar.txt

<path> 相对于工作目录:

$ cd bar/
$ git diff --name-only master --    '*.txt' # no output
$ git diff --name-only master -- '../*.txt'
foo.txt
bar/bar.txt

有没有一种方法可以调用git diff以达到效果

$ cd bar/
$ git diff --name-only master | grep '\.txt$'
foo.txt
bar/bar.txt

无需依靠外部工具?<path>前缀为的A/似乎无效。

星期二

git diffGit称为pathspec的参数gitglossary中定义这是(相当长的)描述的摘录:

以冒号开头的pathspec:具有特殊含义。在简短形式中,前导冒号:后跟零个或多个“魔术签名”字母(可以选择由另一个冒号终止:),其余为与路径匹配的模式。“魔术签名”由ASCII符号组成,它们既不是字母数字,全局,正则表达式特殊字符也不是冒号。如果模式以不属于“魔术签名”符号集且不是冒号的字符开头,则可以省略终止“魔术签名”的可选冒号。

在长格式中,前导冒号:后面紧跟着一个开放的括号(,一个用逗号分隔的零个或多个“魔术词”列表和一个紧密的括号),其余是与路径匹配的模式。...

最佳

    魔术字 top (魔术签名:) / 使模式从工作树的根开始进行匹配,即使从子目录内部运行命令也是如此。

因此,我们可以使用:(top):/:这与您的示例中的设置相同:

$ git diff --name-only
bar/bar.txt
bar/baz.qux
foo.txt

(这些均已修改)

$ cd bar
$ git diff --name-only
bar/bar.txt
bar/baz.qux
foo.txt

(即使没有子目录,也仍然列出所有子目录,即使在子目录中也是如此)

$ git diff --name-only -- '*.txt'
bar/bar.txt

(由于位于子目录和路径规范中,因此仅列出了一个)。现在我们使用pathspec说明符:

$ git diff --name-only -- ':(top)*.txt'
bar/bar.txt
foo.txt
$ git diff --name-only -- ':/:*.txt'
bar/bar.txt
foo.txt

:(top):/:作为前缀列出所有内容)

请参阅文档中剩余的词,它们是功能强大的工具。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章