非注释行的grep文件的Git别名



我正在尝试制作一个git别名来输出.git/info/exclude的内容,减去注释。我正在使用:

[alias]
excluded = !sh -c 'cat .git/info/exclude | grep -v "#"'

但这只是返回grep的用法描述。该行在git别名之外执行良好。

第一:!sh -c ...有点冗余,因为!的意思是";将其余部分穿过外壳";。这里使用CCD_ 4的唯一原因是;外壳";您的Git选择的不是sh,并且您明确需要sh

现在,如果你这样做,它失败的原因应该更明显:

[alias]
test = !sh -c 'echo "pound sign #"'

按原样运行,首先自己运行,然后使用GIT_TRACE=1显示谁吃掉了角色,它会生成:

$ git test
pound sign
$ GIT_TRACE=1 git test
16:54:54.313367 git.c:702               trace: exec: git-test
16:54:54.314881 run-command.c:663       trace: run_command: git-test
16:54:54.318006 run-command.c:663       trace: run_command: 'sh -c '''echo pound sign #''''
pound sign

正如您所看到的,Git本身将文本'echo pound side #'作为sh -c的(单个(参数。错误在于shell:它应该吃掉#,因为这是一个注释:

#! /bin/sh
# everything with # is a comment
echo like this # comment about the echo

如果必须通过#,则需要从shell中引用它,即在它前面加一个反斜杠。当然,要通过Git获得反斜杠,您必须引用它,即在它前面加一个反斜杠:

[alias]
test = !sh -c 'echo "pound sign \#"'

将其应用于您自己的别名(并删除前面提到的sh -c '...'部分(会产生:

[alias]
excluded = !cat .git/info/exclude | grep -v "\#"

它工作,但有一个UUOC(无用的使用猫(:

excluded = !grep -v "\#" .git/info/exclude

足够了。(似乎没有办法在不使用双引号的情况下引用#,即使这样,我们也必须始终保护它不受外壳的影响。(

最新更新