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

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は、エクスポート先指定に要注意
カテゴリ: