9ni*_*x00 166 git git-status
目标是获得可以在shell命令中评估的明确状态.
我试过git status但它总是返回0,即使有提交的项目.
git status
echo $? #this is always 0
Run Code Online (Sandbox Code Playgroud)
我有一个想法,但我认为这是一个坏主意.
if [ git status | grep -i -c "[a-z]"> 2 ];
then
code for change...
else
code for nothing change...
fi
Run Code Online (Sandbox Code Playgroud)
任何其他方式?
通过以下解决更新,请参阅Mark Longair的帖子
我尝试了这个,但它导致了一个问题.
if [ -z $(git status --porcelain) ];
then
echo "IT IS CLEAN"
else
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
echo git status
fi
Run Code Online (Sandbox Code Playgroud)
我收到以下错误 [: ??: binary operator expected
现在,我正在看那个男人并尝试git diff.
===================代码为我的希望,希望更好的答案======================
#if [ `git status | grep -i -c "$"` -lt 3 ];
# change to below code,although the above code is simple, but I think it is not strict logical
if [ `git diff --cached --exit-code HEAD^ > /dev/null && (git ls-files --other --exclude-standard --directory | grep -c -v '/$')` ];
then
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
exit 1
else
exit 0
fi
Run Code Online (Sandbox Code Playgroud)
Mar*_*air 208
测试输出是否git status --porcelain为空的另一种方法是分别测试您关心的每个条件.例如,如果输出中存在未跟踪的文件,则可能并不总是在意git status.
例如,要查看是否存在任何本地未分级更改,您可以查看以下返回代码:
git diff --exit-code
Run Code Online (Sandbox Code Playgroud)
要检查是否有任何已暂存但未提交的更改,您可以使用以下返回代码:
git diff --cached --exit-code
Run Code Online (Sandbox Code Playgroud)
最后,如果您想知道工作树中是否有未被跟踪的未跟踪文件,您可以测试以下命令的输出是否为空:
git ls-files --other --exclude-standard --directory
Run Code Online (Sandbox Code Playgroud)
更新: 您在下面询问是否可以更改该命令以排除输出中的目录.您可以通过添加排除空目录--no-empty-directory,但要排除该输出中的所有目录,我认为您必须过滤输出,例如:
git ls-files --other --exclude-standard --directory | egrep -v '/$'
Run Code Online (Sandbox Code Playgroud)
在-v到egrep装置到不匹配的模式只输出线,而图案与一个结尾的任何线相匹配/.
eck*_*kes 103
返回值git status只是告诉您退出代码git status,而不是是否有任何修改要提交.
如果您想要更多计算机可读版本的git status输出,请尝试
git status --porcelain
Run Code Online (Sandbox Code Playgroud)
有关git status详细信息,请参阅说明.
示例使用(脚本只是测试是否git status --porcelain提供任何输出,不需要解析):
if [ -n "$(git status --porcelain)" ]; then
echo "there are changes";
else
echo "no changes";
fi
Run Code Online (Sandbox Code Playgroud)
请注意,您必须引用要测试的字符串,即输出git status --porcelain.有关测试构造的更多提示,请参阅Advanced Bash Scripting Guide(章节字符串比较).
moo*_*oom 31
如果你像我一样,你想知道是否有:
1)对现有文件的更改2)新添加的文件3)删除的文件
并且特别不想知道4)未跟踪的文件.
这应该这样做:
git status --untracked-files=no --porcelain
Run Code Online (Sandbox Code Playgroud)
如果repo是干净的,这是我的bash代码退出脚本.它使用未跟踪文件选项的简短版本:
[[ -z $(git status -uno --porcelain) ]] && echo "this branch is clean, no need to push..." && kill -SIGINT $$;
Run Code Online (Sandbox Code Playgroud)
可以结合git status --porcelain使用简单的方法grep来执行测试.
if git status --porcelain | grep .; then
echo Repo is dirty
else
echo Repo is clean
fi
Run Code Online (Sandbox Code Playgroud)
我有时将它用作简单的单行程序:
# pull from origin if our repo is clean
git status --porcelain | grep . || git pull origin master
Run Code Online (Sandbox Code Playgroud)
添加-qs到grep命令以使其保持静默.
小智 6
我会对此进行测试:
git diff --quiet --cached
Run Code Online (Sandbox Code Playgroud)
或者这是明确的:
git diff --quiet --exit-code --cached
Run Code Online (Sandbox Code Playgroud)
在哪里:
--退出代码
使用类似于 diff(1) 的代码使程序退出。也就是说,如果存在差异,则以 1 退出,0 表示没有差异。
- 安静的
禁用程序的所有输出。暗示 --exit-code
从git源代码中有一个sh脚本,其中包含以下内容.
require_clean_work_tree () {
git rev-parse --verify HEAD >/dev/null || exit 1
git update-index -q --ignore-submodules --refresh
err=0
if ! git diff-files --quiet --ignore-submodules
then
echo >&2 "Cannot $1: You have unstaged changes."
err=1
fi
if ! git diff-index --cached --quiet --ignore-submodules HEAD --
then
if [ $err = 0 ]
then
echo >&2 "Cannot $1: Your index contains uncommitted changes."
else
echo >&2 "Additionally, your index contains uncommitted changes."
fi
err=1
fi
if [ $err = 1 ]
then
test -n "$2" && echo >&2 "$2"
exit 1
fi
}
Run Code Online (Sandbox Code Playgroud)
此代码段显示了如何使用它git diff-files并git diff-index查明以前已知文件是否有任何更改.但是,它不允许您查明是否已将新的未知文件添加到工作树中.
我在脚本中使用它来实现:
1 当存在差异或未跟踪的文件时
[ -z "$(git status --porcelain)" ]
我的讨论有点晚了,但如果只是需要退出代码 0 ifgit status --porcelain不返回任何内容并且 != 0 else,请尝试以下操作:
exit $( git status --porcelain | wc -l )
Run Code Online (Sandbox Code Playgroud)
这将使行数成为退出代码,当行数超过 255 行时,就有出现问题的风险。所以
exit $( git status --porcelain | head -255 | wc -l )
Run Code Online (Sandbox Code Playgroud)
将解释这一点;)