2012-01-12 69 views
6

我有一些shell脚本,我想检查我的一个git回购。我想 知道这个回购是否有一切承诺,如果它推到掌握。 在此测试之前,我做了git fetch以确保我有最新的更改。检查本地git回购已承诺并推送到主

我已经找到了方法来检查,如果回购有一些未提交的更改:

if ! git --work-tree=$HOME/git/project --git-dir=$HOME/git/project/.git diff-index --quiet HEAD --; then 
    echo "Has some changes"; 
fi 

但这并不是我唯一需要的。我也想确保我的所有 本地提交被推送给主。

最简单的方法是什么?

回答

-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' 

而且你还可以使用退出代码,看看是否一切都将提交和 推与否。

正是在Github上:https://github.com/bessarabov/App-IsGitSynced和CPAN:https://metacpan.org/module/App::IsGitSynced

+0

Mark Longair和你的解决方案似乎错过了未跟踪的文件。所以根据你的目的,目录可能仍然被认为是脏的。 – 2013-10-02 04:06:35

+0

@ vlad-didenko也许我不会不喜欢你,但我的解决方案显示未跟踪的文件。屏幕截图:http://upload.bessarabov.ru/bessarabov/LbYgP0Daba-oJ5vCDa8Wag8a5H8.png使其成为代码:https://metacpan.org/source/BESSARABV/App-IsGitSynced-1.0.0/bin/is_git_synced# L84 – bessarabov 2013-10-02 15:21:12

+0

是的,我相信这是我不够清楚。 “git diff --exit-code && git diff --cached --exit-code”命令不会捕获未跟踪的文件。你的解决方案是一个很大的(相对)脚本,它几乎不是上述“最简单的方法”问题的答案 - 这个问题显然需要一些简单的命令。作为通过搜索来到这里的人,我没有看到答案 - 因为通过相当多的perl脚本不是一个(好的)答案。可能是在那里,但不在这里:) – 2013-10-03 01:44:29

5

您可以检查一切是否与承诺:

git diff --exit-code && git diff --cached --exit-code 

在典型配置中,在成功推到masterorigin,远程跟踪分支origin/master将被更新。因此,要检查是否已经被推所有的修改,你可以测试是否:

git rev-parse --verify master 

...是一样的:

git rev-parse --verify origin/master 
8

一个非常简单的方法来做到这将是简单地调用

GIT中推-n

(意味着 “-n” 是短期的 “--dry运行”,即代替它会告诉你它会推动什么)

如果它说“一切都是最新的”,那么你已经推动了所有的东西来源。

或者,它会给你一个尚未推送到所有提交的提交列表。

或者如果您的原产地有变化,您还没有拉下来,那么它可能会抱怨潜在的合并,这将导致推(这复制“有一些变化”,检查你已经在做)

+1

如果您在本地分支机构,则会提供“一切均为最新”。即使这个分支上没有任何东西被推送。 – BetaRide 2014-01-06 13:20:24

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-codegit diff --cached --exit-code检查本地提交的更改。