检查存储库是否有变化的最快方法?

时间:2017-11-23 15:56:43

标签: git bash macos terminal zsh

我想检查一下git存储库是否有变化。

我一直在使用这个条件

if command git status --porcelain 2> /dev/null | grep -q .; then
  X
else
  Y
fi

但是太慢了。

有更快的方法吗?我是否必须依赖git命令才能执行此操作,或者是否存在完全绕过该命令的超快速方法?

3 个答案:

答案 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并关闭管道;否则它可能会在打印之前缓冲几十个检测到的差异。