在“git status --ceramic”中添加什么来使其表现得像“git status”?

kkbh8khc  于 2023-01-15  发布在  Git
关注(0)|答案(2)|浏览(110)

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何时有未推送的更改?2特别是,这是一个正确的方法吗?

#!/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是否合适,或者我应该使用"plumbing"命令来代替?

kxkpmulp

kxkpmulp1#

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)?

polhcujo

polhcujo2#

TLDR;

git status --branch --porcelain
           ^^^^^^^^

注意:git status --porcelain在git 1.9.2版本中被commit 7a76c28修改过(2014年4月),作者:Matthieu Moy moy

使用--ceramine时禁用转换

"git status --branch --porcelain"显示分支的状态(超前、滞后、结束),并使用gettext转换字符串。
当使用--porcelain时,使用硬编码字符串,但保留"git status --short"的gettext翻译,这本质上是相同的,但意味着由人类读取。
这意味着git status --porcelain始终显示与git status不同的结果,这一次是因为缺少转换。
但是现在输出总是相同的(与用于转换的LOCALE无关,因为所述转换现在被--porcelain选项停用)
并且git status --porcelain在Git 2.13中再次得到了改进(Q2 2017)
"git status --porcelain"应该提供稳定的输出,但是错误地将一些字符串保留为可翻译。
参见commit b9e2bc5(2017年3月14日),作者为Michael J Gruber ( mjg )
(由Junio C Hamano -- gitster --合并至commit 58e9773,2017年3月17日)
确保剩下的两个字符串(初始提交、分离头)也是稳定的。

相关问题