Git

gitでsvn export的なことをやる

More than 4 years have passed since last update.

git 管理のファイル群をバイナリ抜きで配布したい!
という時があるかもしれない。

そんな時は以下のコマンド一発

$ git checkout-index -a -f --prefix=export/

最後の / を忘れるとかなり悲惨な目に会うので注意。
また。当然ながら git 管理下のディレクトリで実行しないと怒られる。

上記コマンドで、カレントディレクトリに export という名前で、
git で管理してる全ファイルを含むディレクトリが作成される。

環境によっては --prefix で親ディレクトリや全く別な場所を指定するのも良いかもしれない。

ただし、 .gitignore とかも含まれるので、配布したい場合は手動削除するか、
シェルスクリプトを用意するなり、 alias に一緒に登録しておくと良さげ。


追記

ngyuki さんにコメントいただいた、 git archive で実現する方法。

コメントにもあるように .gitattributes の設定を見てくれるので、
hoge ディレクトリ以下を除外したい場合であれば、

hoge/ export-ignore

のように書いておけば、 git archive が除外してくれる。

前述の checkout-index と同じことをやろうとするなら、

$ mkdir ../export
$ git archive --format=tar HEAD | tar -C ../output -xf -

といった具合に、出力形式を tar にしてパイプで展開する。

当然、そのままアーカイブを出力することも可能

git archive --format=zip HEAD > hoge.zip
git archive --format=tar HEAD | bzip2 > fuga.tar.bz2

任意のディレクトリ、ファイルのみアーカイブも可能

$ git archive --format=zip HEAD hoge.file fugadir > archive.zip

まとめ

配布を目的とするならば、設定さえしてしまえば git archive のほうがミスが少なく便利。
コメントに書いたように配布先により異なるケースでも、シェルスクリプト書けば済む話しだし。

git checkout-index は、あえて全ファイルを export したい場合や、
全体を把握していないリポジトリでも、 とりあえず何とかなる、という感じかな。