2012-01-12 102 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檢查本地提交的更改。