检查本地git repo是否已提交所有内容并推送到master

bes*_*bov 7 git

我有一些shell脚本,我想检查我的一个git repos.我想知道该回购是否已经提交了所有内容以及是否将其推送到掌握.在此测试之前,我进行git fetch以确保我有最新的更改.

我找到了检查repo是否有一些未提交更改的方法:

if ! git --work-tree=$HOME/git/project --git-dir=$HOME/git/project/.git diff-index --quiet HEAD --; then
    echo "Has some changes";
fi
Run Code Online (Sandbox Code Playgroud)

但这不是我唯一需要的东西.我还想确保所有本地提交都被推送到掌握.

最简单的方法是什么?

Tre*_*ell 8

一个非常简单的方法就是简单地打电话

git push -n

("-n"是"--dry-run"的缩写,这意味着它不会执行推送,而是会告诉您它将推送的内容)

如果它说"一切都是最新的",那么你已经把所有东西都推到了原点.

或者,它将为您提供尚未推送到源的所有提交的列表.

或者,如果您尚未下拉的原点发生变化,那么它可能会抱怨可能由推送引起的合并(这会重复"有一些更改",检查您已经在做什么)

  • 如果您在本地分支,这会提供“所有内容都是最新的”。即使这个分支上没有任何东西被推送。 (2认同)

Mar*_*air 7

您可以检查所有内容是否已提交:

git diff --exit-code && git diff --cached --exit-code
Run Code Online (Sandbox Code Playgroud)

在典型配置中,成功推送到masterin后origin,origin/master将更新远程跟踪分支.因此,要检查是否已推送所有更改,您可以测试是否:

git rev-parse --verify master
Run Code Online (Sandbox Code Playgroud)

... 是相同的:

git rev-parse --verify origin/master
Run Code Online (Sandbox Code Playgroud)


bes*_*bov -1

从 Mark Longair 的精彩回答中,我了解到可以检查本地 git 存储库是否已提交并推送所有内容,但您需要运行多个命令才能执行此操作。

我写了一个小脚本来完成所有这些工作,并以友好的方式写下所发生的事情。

$ is_git_synced ~/git/* --only_errors
Error: path '/home/bessarabov/git/Dancer' has staged changes
Error: path '/home/bessarabov/git/Ubic' has some divergences with remote 'origin'
Run Code Online (Sandbox Code Playgroud)

您还可以使用退出代码来查明所有内容是否已提交和推送。

它位于 Github: https: //github.com/bessarabov/App-IsGitSynced和 CPAN 上: https: //metacpan.org/module/App::IsGitSynced