列出具有 git 属性集的所有文件
list all files having a git attribute set
git check-attr
允许我检查是否在 .gitattributes
中为一组特定文件设置了属性。
例如:
# git check-attr myAttr -- org/example/file1 org/example/file2
org/example/file1: myAttr: set
org/example/file2: myAttr: unspecified
是否有一种简单的方法来列出所有设置了 myAttr
的文件,包括所有通配符匹配项?
您可以使用 git ls-files
将存储库中所有文件的列表设置为参数,如下所示:
git check-attr myAttr `git ls-files`
如果您的存储库中的文件过多,您可能会出现以下错误:
-bash: /usr/bin/git: Argument list too long
你可以用 xargs 来克服:
git ls-files | xargs git check-attr myAttr
最后,如果文件太多,您可能需要过滤掉未指定参数的文件,以使输出更具可读性:
git ls-files | xargs git check-attr myAttr | grep -v 'unspecified$'
使用 grep,您可以对此输出应用更多过滤器,以便只匹配您想要的文件。
如果您只想获取文件列表,并使用 NUL 字符来恢复包含 \n
或 :
的文件名或属性,您可以这样做:
对于具有属性“merge=union”的文件列表:
git ls-files -z | git check-attr --stdin -z merge | sed -z -n -f script.sed
与script.sed:
# read filename
x # save filename in temporary space
n # read attribute name and discard it
n # read attribute name
s/^union$// # check if the value of the attribute match
t print # in that case goto print
b # otherwise goto the end
:print
x # restore filename from temporary space
p # print filename
# start again
与内联的 sed 脚本相同(即使用 -e
而不是 -f
,忽略注释并用分号替换换行符):
git ls-files -z | git check-attr --stdin -z merge | sed -zne 'x;n;n;s/^union$//;t print;b;:print;x;p'
PS:结果使用 NUL 字符分隔文件名,使用 | xargs --null printf "%s\n"
以便以人类可读的方式打印它们。
其他帖子对我来说效果不佳,但我做到了:
git ls-files | git check-attr -a --stdin
"Check every file in git and print all filters" 一个班轮。
git check-attr
允许我检查是否在 .gitattributes
中为一组特定文件设置了属性。
例如:
# git check-attr myAttr -- org/example/file1 org/example/file2
org/example/file1: myAttr: set
org/example/file2: myAttr: unspecified
是否有一种简单的方法来列出所有设置了 myAttr
的文件,包括所有通配符匹配项?
您可以使用 git ls-files
将存储库中所有文件的列表设置为参数,如下所示:
git check-attr myAttr `git ls-files`
如果您的存储库中的文件过多,您可能会出现以下错误:
-bash: /usr/bin/git: Argument list too long
你可以用 xargs 来克服:
git ls-files | xargs git check-attr myAttr
最后,如果文件太多,您可能需要过滤掉未指定参数的文件,以使输出更具可读性:
git ls-files | xargs git check-attr myAttr | grep -v 'unspecified$'
使用 grep,您可以对此输出应用更多过滤器,以便只匹配您想要的文件。
如果您只想获取文件列表,并使用 NUL 字符来恢复包含 \n
或 :
的文件名或属性,您可以这样做:
对于具有属性“merge=union”的文件列表:
git ls-files -z | git check-attr --stdin -z merge | sed -z -n -f script.sed
与script.sed:
# read filename
x # save filename in temporary space
n # read attribute name and discard it
n # read attribute name
s/^union$// # check if the value of the attribute match
t print # in that case goto print
b # otherwise goto the end
:print
x # restore filename from temporary space
p # print filename
# start again
与内联的 sed 脚本相同(即使用 -e
而不是 -f
,忽略注释并用分号替换换行符):
git ls-files -z | git check-attr --stdin -z merge | sed -zne 'x;n;n;s/^union$//;t print;b;:print;x;p'
PS:结果使用 NUL 字符分隔文件名,使用 | xargs --null printf "%s\n"
以便以人类可读的方式打印它们。
其他帖子对我来说效果不佳,但我做到了:
git ls-files | git check-attr -a --stdin
"Check every file in git and print all filters" 一个班轮。