Git

リモートブランチから特定のコミットだけを取得する

More than 1 year has passed since last update.


概要

2015年にリリースされた Git 2.5 からリポジトリの設定を変更することで特定のコミットだけを取得できるようになりました。詳細な解説は stackoverflow の回答をご参照ください。練習として Git のテストケース (t/t5516-fetch-push.sh) を手で実行してみました。


テストのリポジトリをつくる

リポジトリをつくり、uploadpack.allowtipsha1inwant を有効にします。

git init testrepo

cd testrepo
git config uploadpack.allowtipsha1inwant true

コミットの履歴をつくってみましょう。

git commit --allow-empty -m foo

git commit --allow-empty -m bar
git commit --allow-empty -m baz

コミットのハッシュを調べて変数 $SHA1 に記録しておきます。次のコマンドでは最新のコミットから1つ前のコミットのハッシュを取得します。

SHA1=$(git rev-parse HEAD^1)

.git のパスを指定することもできます。

SHA1=$(git --git-dir=testrepo/.git rev-parse HEAD^1)


shallow リポジトリをつくる

git init shallow

cd shallow
git --git-dir=../testrepo/.git config uploadpack.allowreachablesha1inwant true

fetch してみましょう。$SHA1 は取り込みたいコミットのハッシュです。

git fetch --depth=1 ../testrepo/.git $SHA1

コミットされた内容を調べてみましょう。

git cat-file commit $SHA1

今度は merge してみましょう。

git merge $SHA1

ログを調べてみましょう。1つのコミットしか存在しないはずです。

git log


コミットのハッシュを調べる

一番単純な方法は git log ですが、ハッシュ以外の情報は不要なので、ハッシュだけを求めるためのコマンドを使ってみましょう。

まずは最新のコミットのハッシュを求めてみます。

git rev-parse HEAD

短縮形を求めてみましょう。

git rev-parse --short HEAD

ブランチの名前を指定して調べることもできます。

git rev-parse master

1つ前のコミットのハッシュを調べてみましょう。

git rev-parse HEAD~1

ハッシュのリストを求めてみましょう。

git rev-list HEAD

数を制限することができます。

git rev-list HEAD -n 2