要添加到"git status --porcelain"以使其表现得像"git status"?

use*_*270 6 git

之前的一个问题产生了一些关于如何检查你的Git repo是否包含脏索引或未跟踪文件的想法.我从讨论中得出的答案如下:

#!/bin/sh
exit $(git status --porcelain | wc -l)
Run Code Online (Sandbox Code Playgroud)

这个答案背后的想法是模仿程序员会做什么:运行git status然后检查输出.

不幸的是git status --porcelain,git status并没有完全相同的事情.特别是,git status将报告未按下的更改,而git status --porcelain不会.这是一个例子

[jarmo@localhost math-hl]$ git status --porcelain
[jarmo@localhost math-hl]$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#   (use "git push" to publish your local commits)
#
nothing to commit, working directory clean
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:我需要添加到原始脚本中以确定何时repo已经未按下更改?特别是,这是一种正确的方法吗?

#!/bin/bash
if [ $(git status --porcelain | wc -l) != "0" \
        -o $(git log @{u}.. | wc -l) != "0" ];  then
        echo "local repo is not clean"
Run Code Online (Sandbox Code Playgroud)

从长远来看,是否可以依赖git log,或者我应该使用"管道"命令?

Von*_*onC 6

git 脚本中的想法是始终使用:

请参阅“ Git 中术语瓷器是什么意思? ”。
正如我所解释的,--porcelain不幸的是(因为它的命名令人困惑),该选项是获取状态的“管道”方式,即“可靠”方式,这意味着它的格式不会随着时间的推移而改变,这就是它的原因推荐的脚本命令。

对于git log,最好使用git rev-list

git rev-list HEAD@{upstream}..HEAD
Run Code Online (Sandbox Code Playgroud)

请参阅“如何知道 git 存储库是否有尚未与服务器(源)同步的更改?