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

时间:2013-10-06 08:18:48

标签: git

An earlier question产生了一些关于如何检查您的Git repo是否包含脏索引或未跟踪文件的想法。我从讨论中得出的答案如下:

#!/bin/sh
exit $(git status --porcelain | wc -l)

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

不幸的是git status --porcelaingit 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

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

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

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

2 个答案:

答案 0 :(得分:2)

git脚本中的想法总是使用:

请参阅“What does the term porcelain mean in Git?” 正如我解释的那样,遗憾的是--porcelain选项(因为它的命名令人困惑),获取状态的“管道”方式,即“可靠”方式,意味着其格式不会随时间而变化,这就是为什么它是脚本编写的推荐命令。

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

git rev-list HEAD@{upstream}..HEAD

请参阅“How to know if git repository has changes that have not been synchronized with server (origin)?

答案 1 :(得分:1)

注意:git status --porcelain使用commit 7a76c28更加可靠,对于git 1。9。2(2014年4月),Matthieu Moy moy

在使用--porcelain

时禁用翻译
  

" git status --branch --porcelain"显示分支的状态   (前进,后退,离开),并使用gettext翻译字符串。

     

使用--porcelain时使用硬编码字符串,但保留gettext   翻译为" git status --short"这基本上是相同的,但是   意在被人类阅读。

这意味着git status --porcelain会显示与git status不同的结果,这次是因为缺少翻译。
但是输出现在总是相同的(独立于用于翻译的LOCALE,因为所述翻译现在被--porcelain选项停用)


并且git status --porcelain在Git 2.13(2017年第二季度)中再次得到改善

  

" git status --porcelain"应该给出一个稳定的输出,但是   很少有字符串被误删了。

commit b9e2bc5Michael J Gruber (mjg)(2017年3月14日) Junio C Hamano -- gitster --于2017年3月17日commit 58e9773合并)

  

确保剩余的两个字符串(初始提交,分离头)   也很稳定。