Gitでexportするときはgit archiveとgit checkout-indexのどちらがよいか

Gitでブランチをまるごとexportしたいとき、主にgit archiveとgit checkout-indexの2通りのやり方があります。
どちらを使うべきなのかもやもやしたので、違いを調べてみました。

結論

結論から言うとgit archiveの方がこの用途には適していると思います。
git checkout-indexは挙動にクセがあり、ミスしやすいです。

好みの問題なのでどちらでやってもよいのですが、初心者であればgit archiveの方をお勧めします。

git archive

masterブランチをエクスポートしたいとします。
mkdir /tmp/foo
git archive master | tar -x -C /tmp/foo
(必ず先に空のディレクトリを作っておきましょう。)
export-ignoreが便利
export-ignoreという便利なオプションがあって、例えばexport時に"test"ディレクトリだけ除外するということができます。
$Id$展開もしてくれる
ident属性が設定してあればファイル中の$Id$をキーワード展開してくれます。
$Id$
↓
$Id: 547efb313cdee8eb3e37371f800f3bee3479c166 $

参考:Git-のカスタマイズ-Git-の属性#リポジトリをエクスポートする

git checkout-index

mkdir /tmp/foo
git checkout-index -a --prefix=/tmp/foo/
--prefixの落とし穴に注意!
実は--prefixの指定方法に落とし穴があります。

例えば末尾スラッシュなしで
--prefix=/tmp/foo
としてしまうと、
/tmp/fooapp
/tmp/foolib
/tmp/foowww

のようなわけのわからない形でエクスポートされてしまいます。

また、チルダを使って
--prefix=~/tmp/foo/
と書くと、チルダ展開してくれない代わりに~という名前のディレクトリをカレントディレクトリに作っちゃってくれます。
これは泣ける。

checkout-indexの利点は何かというと、「インデックス(ステージング)のツリー状態をエクスポートしてくれること」です。
ですがこのようなニーズはほとんどないでしょう。

まとめ

  • ブランチをエクスポートするならgit archiveが便利
  • git archiveは、除外ディレクトを指定できる
  • git checkout-indexは、エクスポート先指定に要注意
カテゴリ: