代码之家  ›  专栏  ›  技术社区  ›  Bango

为什么我不应该使用这个Git命令来判断我的回购协议是否有任何变化?

  •  3
  • Bango  · 技术社区  · 7 年前

    我已经为我的应用程序拼凑了一个更新程序,这样几乎没有编码技能的人就可以在自己的机器上安装、运行和更新应用程序。

    以下是为Windows命令提示符编写的更新程序示例:

    @echo off
    for /f %%i in ('call git status --porcelain') do set stash=%%i
    if not [%stash%] == [] (
      echo Stashing local changes...
      call git add .
      call git stash -q
    )
    echo Updating App...
    call git pull origin master
    if not [%stash%] == [] (
      echo Restoring local changes...
      call git stash apply -q
    )
    echo Updating Dependencies...
    call npm update
    echo Done
    pause
    

    如你所见,我正在打电话 git status --porcelain 判断应用程序是否有本地更改,这些更改需要在拉动远程主分支之前隐藏。

    此命令将返回 没有什么 如果工作目录是干净的,但将始终返回 某物 如果有本地更改、跟踪或其他。

    我从其他SO帖子中读到,在git中使用Cellar命令来做管道工作是不好的,但在这种情况下,它对我来说很好,我不明白为什么 git状态——瓷器 命令永远不会返回 某物 当有一个干净的工作目录时。

    所以我的问题是: 在这个特定的用例中使用瓷器是错误的吗?如果是,为什么?

    奖励:有什么更好的方法可以做到这一点?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Bango    7 年前

    git status 具有 --porcelain 转换此外,当你查看文档时,你会发现你完全按照设计的方式使用了该命令:

    与短输出类似,但在Git中保持稳定

    这里的另一个选项是使用 -s git status -s )它还将返回易于解析的输出,但可能无法保证在未来版本中以相同的方式工作。

    我没有发现 git状态 无论如何都不正确。它完成了任务,它以易于理解的方式可靠地完成任务。

    陶瓷的等效命令可能是:

    git ls-files --exclude-per-directory=.gitignore --exclude-from=.git/info/exclude --others --modified -t
    

    但是从 git ls-files -t 开关:

    此功能已被半弃用。为了编写脚本, git状态(1)--Cellar和git diff文件(1)--名称状态几乎相同 用户应该查看git状态(1)——short或git diff(1)——名称状态,以获得更为用户友好的替代方案。

    所以你看,即使是git手册也建议使用 git状态 可供替代的

        2
  •  2
  •   Matthieu Moy    7 年前

    git status --porcelain 不是瓷器命令。该选项的名称具有误导性,但它实际上意味着“提供易于解析和稳定的输出,适合在陶瓷脚本中使用”。所以 --porcelain 表示“充当管道命令”。

    正如在另一个答案中所说的,你所做的没有错, --瓷器 就是要按你的方式使用。