我想检查一下git存储库是否有变化。
我一直在使用这个条件
if command git status --porcelain 2> /dev/null | grep -q .; then
X
else
Y
fi
但是太慢了。
有更快的方法吗?我是否必须依赖git
命令才能执行此操作,或者是否存在完全绕过该命令的超快速方法?
答案 0 :(得分:1)
Git自己的源代码可以为您提供一个好的解决方案提示:require_clean_work_tree shell函数基本上可以满足您的需求。这是一个较短的版本(不看分阶段的变化):
git_has_changes() {
git update-index -q --ignore-submodules --refresh
git diff-files --quiet --ignore-submodules
}
if git_has_changes; then
echo "has changes"
else
echo "no change"
fi
答案 1 :(得分:0)
我发现--short
选项适用于此类事情。如果没有任何改变,它返回一个空字符串:
test -n "$(git status --short)" && echo 'changes detected' || echo 'no change'
我不知道是否有任何提速。
答案 2 :(得分:0)
(编辑:剥离GNUism,这是一个合理的posix-only测试)
if (git diff-index --cached @; git diff-files) | grep -q .; then
tracked changes in index or worktree
else
index and tracked worktree content identical to checkout
fi
列出了HEAD和索引中具有不同内容的路径,以及索引和工作树中具有不同内容的路径,而没有花时间计算出这些差异。
如果由于某种原因你想要在响应时间内每隔一毫秒削减一次,你可以使用stdbuf -oL git
使git line-buffer输出,所以第一个diff会立即命中sed并关闭管道;否则它可能会在打印之前缓冲几十个检测到的差异。