之前的一个问题产生了一些关于如何检查你的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,或者我应该使用"管道"命令?
git 脚本中的想法是始终使用:
请参阅“ Git 中术语瓷器是什么意思? ”。
正如我所解释的,--porcelain不幸的是(因为它的命名令人困惑),该选项是获取状态的“管道”方式,即“可靠”方式,这意味着它的格式不会随着时间的推移而改变,这就是它的原因推荐的脚本命令。
对于git log,最好使用git rev-list:
git rev-list HEAD@{upstream}..HEAD
Run Code Online (Sandbox Code Playgroud)
请参阅“如何知道 git 存储库是否有尚未与服务器(源)同步的更改? ”