我有一些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
但这不是我唯一需要的东西。我也想确保我所有的 本地提交被推向掌握。
最简单的方法是什么?
答案 0 :(得分:8)
一种非常简单的方法就是简单地调用
git push -n
(“-n”是“--dry-run”的缩写,这意味着它不会进行推送,而是会告诉你它会推动什么)
如果它说“一切都是最新的”,那么你已经把一切都推到了原点。
或者,它将为您提供尚未推送到原点的所有提交的列表。
或者,如果您尚未撤消原点的更改,那么它可能会抱怨可能由推送引起的合并(这会重复“有一些更改”,检查您已经在做什么)
答案 1 :(得分:7)
您可以通过以下方式检查所有内容是否已提交:
git diff --exit-code && git diff --cached --exit-code
在典型配置中,成功推送到master
中的origin
后,远程跟踪分支origin/master
将会更新。因此,要检查是否已推送所有更改,您可以测试是否:
git rev-parse --verify master
...与:
相同git rev-parse --verify origin/master
答案 2 :(得分:1)
在git fetch
之后,要检查分支机构中是否存在尚未推送到远程设备的本地提交,请尝试以下操作:
git diff --exit-code <remote>/<branch>..<branch>
这也会告诉您遥控器中是否有本地没有的提交。请注意,这只是检查更改,因此如果远程和本地分支中的更改提交相同,则此命令可能无法检测到此更改。在脚本中,我通常将其传递给/dev/null
并检查返回状态。因此,假设您的遥控器为origin
且分支为master
,则命令如下所示:
git diff --exit-code origin/master..master > /dev/null
正如其他人所建议的那样,我还使用git diff --exit-code
和git diff --cached --exit-code
来检查本地未提交的更改。
答案 3 :(得分:-1)
从马克·朗格尔(Mark Longair)那里得到的答案,我明白这是可以检查的 当地的git repo已经提交并推送了所有东西,但你需要运行 这样做的几个命令。
我写了一个小脚本,完成所有这些并以一种非常方式写出来 已经发生了。
$ 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'
您还可以使用退出代码来查明是否所有内容都已提交 推或不。
在Github:https://github.com/bessarabov/App-IsGitSynced和CPAN:https://metacpan.org/module/App::IsGitSynced