【问题标题】:Long Git command causes error as npm script长 Git 命令导致错误作为 npm 脚本
【发布时间】:2020-11-19 05:05:08
【问题描述】:

我将此 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'.

我尝试将命令放在反引号中,但又出现了一个错误。我必须对此命令进行一些转义还是如何让它工作?

【问题讨论】:

    标签: git npm npm-scripts


    【解决方案1】:

    将所有单引号 (') 替换为 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\""
                                                                               ^^                 ^^                 ^^                                                       ^^ 
    

    【讨论】:

      【解决方案2】:

      我不确定 NPM 是如何转义字符串并在命令行/终端上传递它的,但您可以通过一些标准技巧来解决这个问题。

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

      尝试以下方法:

      1. 单双引号颠倒(单引号外)

      2. 在内引号前添加反斜杠

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

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


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

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

      Git 不会将“%H”识别为无论该参数是什么都是有效的,它打印的错误消息就是结果。

      【讨论】:

        猜你喜欢
        • 2021-02-11
        • 1970-01-01
        • 2016-07-25
        • 2014-04-14
        • 2020-07-06
        • 2017-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多