Long Git 命令导致错误作为 npm 脚本

Long Git command causes error as npm script

我将此 npm 脚本添加到我的 package.json 文件中:

"gitlog" : "git log --graph --decorate -30 --all --date-order --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s'"

但是当我键入 npm run gitlog 时,我收到错误消息:fatal: Invalid object name '%H'.

我尝试将命令放在反引号中,但出现了另一个错误。我必须对这个命令做一些转义或者我怎样才能让它工作?

我不确定 NPM 如何转义字符串并在命令 line/terminal 上传递它,但您可能可以通过一些关于双重​​打包字符串的标准技巧来解决这个问题。

这里发生了两次字符串解析 - 首先将 package.json 文件中的 JSON 发送到 NPM,然后 NPM 将字符串发送到 terminal/command 行。因此,您需要弄清楚如何以一种方式嵌入内部引号,以便它们进入命令行(以一种与 git 一致的方式)。

尝试以下操作:

  1. 反转单双引号(单引号外)

  2. 在内引号前加反斜杠

    • 反斜杠通常是特殊字符的转义字符
    • 解析字符串时,引号是特殊字符
  3. 将内引号从单引号改为双引号后,在内引号前添加反斜杠

  4. 尝试复制所有内部引号(即代替 '%C(cyan)...' 尝试 ''%C(cyan)...''""%C(cyan)..."")。有时解析器会将重复的引号视为转义字符,并在传递的最终输出中只放置一个单引号。


我怎么知道这是根本原因?

这里的线索是错误输出。如果您在字符串中找到第一个“%H”,您会看到它前面有一个 space。如果单引号被去掉,那么 git 将看到 space,并将其后的文本视为新参数的开始。

Git 无法将“%H”识别为有效的参数,因此它打印的错误消息就是结果。

将所有单引号 (') 替换为 JSON 转义双引号 (\"),例如

"gitlog": "git log --graph --decorate -30 --all --date-order --date=format:\"%Y-%m-%d %H:%M:%S\" --pretty=format:\"%C(cyan)%h%Creset %C(black bold)%ad%Creset%C(auto)%d %s\""
                                                                           ^^                 ^^                 ^^                                                       ^^