10

较早的一个问题导致了一些关于如何检查您的 Git 存储库是否包含脏索引或未跟踪文件的想法。我从那次讨论中采纳的答案如下:

#!/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,还是应该使用“管道”命令?

4

2 回答 2

4

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

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

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

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

参见“如何知道git仓库有没有与服务器(源)同步的变化?

于 2013-10-06T08:31:41.830 回答
2

注意:git status --porcelain刚刚通过提交 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" 应该提供稳定的输出,但有一些字符串被错误地保留为可翻译。

请参阅Michael J Gruber ( )的提交 b9e2bc5(2017 年 3 月 14 日) 。(由Junio C Hamano 合并 -- --提交 58e9773中,2017 年 3 月 17 日)mjg
gitster

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

于 2014-07-02T19:58:52.787 回答