Git

gitのリモートリポジトリの更新を確認する

More than 5 years have passed since last update.

gitのリモートリポジトリが更新されているかどうかを確認する方法はいくつかあります。

方法1: git fetch 後にdiffをとる

$ git fetch origin
$ git diff origin/master

方法2: git ls-remote コマンドを使用する

git ls-remoteを使用することでリモートリポジトリのコミットIDが取得できます。

リモートリポジトリの最新コミットID(HEAD)とローカルの最新コミットID(HEAD)を比較し、その2つが異なっていれば差分があると判断できます。
さらに、リモートのコミットIDが過去に存在しないものであれば、ローカルのリポジトリが古い(マージしていないコミットがリモートに存在する)ことになります。

$ git ls-remote origin HEAD
78ddd44eb3b76017a55014f27d9f846054dfa52b        HEAD
$ git log -1 HEAD  # or master
commit 8741c1a1fd81e0e3620e7054f3731ad2338f25fa
$ git log -1 origin/HEAD  # or origin/master
commit 8741c1a1fd81e0e3620e7054f3731ad2338f25fa

方法3: git remote show コマンドを使用する

以下のように実行結果の最終行に (local out of date) と表示されていればローカルの方が古いことになります。(ブランチが複数ある場合は複数行表示されます)

ただし、リモートブランチと同名のブランチがローカルにも存在する場合のみ表示されます。
また、リモートブランチと異なる名前のブランチは upstream/tracking branch を設定していても表示されません。(残念…)

git remote show origin
* remote origin
  Fetch URL: git://github.com/Shougo/unite.vim.git
  Push  URL: git://github.com/Shougo/unite.vim.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date)

以上の3種類が私の知っている方法です。
(他にもあるようでしたら教えて頂けるとありがたいです)

方法1が最もメジャーな方法かと思いますが、fetchを行う必要があるという点でやや面倒ではあります。とはいえ細かいdiffを確認する場合には必須ですが。
方法2/方法3はfetchが不要で、ざっくりと更新状況を見たい場合に利用できます。
特に方法3が分かりやすいですね。

方法4を提案

一応今回の本題…方法2,3の拡張版です。

チェックするリポジトリが1つ2つなら上記の方法でも良いかと思いますが、たくさんのリポジトリの更新状況を確認したい場合には少々面倒です。

そこで、今回は複数のリポジトリの更新状況をざっくり確認するコマンドgit-checkを作成しました。

まずは実行結果です。

sample01

こんな感じにざっくりと更新状況が確認できます。
submoduleが存在する場合はインデントされて表示されています。
(上記はneobundleで管理しているvimプラグインのリポジトリの更新状況を確認しています)

導入方法

下記githubのリポジトリからcloneまたはダウンロードし、中にあるgit-checkコマンドをPATHの通った所に置いて下さい。

yonchu/git-check · GitHub

$ git clone https://github.com/yonchu/git-check.git
$ mv git-check/git-check ~/bin

gitを使用しない場合はここから直接ダウンロードして下さい。

使用方法

Usage:
git-check [-s|-r|-w] [-f <Repositories list file>] [Directory ...]

Options:
  -s : git status を確認
  -r : リモートリポジトリの更新状況を確認
  -w N : インデント幅 (Default: 4)
  -f [File] : リポジトリのディレクトリパスを記述したファイルを指定
  ※-s/-r いずれも未指定の場合は両方表示します

ディレクトリは複数指定が可能で、ワイルドカードを使用することもできます。
関係のないファイルやディレクトリは無視しますのでワイルドカードでざっくりと指定すると良いでしょう。ディレクトリ未指定の場合はカレントディレクトリが対象になります。

-r指定でリモートリポジトリの更新状況を確認できますが、他にも-sを指定することでgit status --shortの結果を表示することもできます。

sample02

また、-fを指定することでリポジトリの場所をファイルで指定することもできます。

$ cat repos.txt
~/dotfiles
~/dotfiles.local
~/work/dev/myproject/*
~/work/dev/github/*
~/work/dev/gist/*
~/work/dev/github_tracking/*

$ git-check -f repos.txt

よくチェックするものをファイル内に記述しておくことでチェックが楽になります。

蛇足

な、長い…方法1,2,3の説明が蛇足だった気がする…