手元のマシンでgitで管理しているファイルを別のマシンに送りたいと思ったときに、以下の3つが自分の中にはあった。
- 一旦リモートリポジトリにpushして別マシンからcloneする
-
git reset --hard
した後、zip圧縮して送る -
git clone project-name copy-of-project-name
した後、copy-of-project-name
を圧縮して送る
ただ、どれも微妙な気がしていた。
そこでgit bundle
というものを知ったので試した。
ざっくりいえば、gitリポジトリのある範囲の内容を1ファイルにまとめる的な事をやってくれるらしい。
手順
今回はmasterブランチの内容をまとめて持っていく感じで使う。
まず、master
ブランチを対象に project-name.bundle
というバンドルファイルを作る。
git bundle create project-name.bundle master
これで同ディレクトリにproject-name.bundle
というバンドルファイルができあがる。
これをリモートマシンへどうにかして送る。(scpとかftpとかUSBメモリとか)
受け取ったら以下のようにして取り込む。
# バンドルファイルからcloneする
git clone project-name.bundle project-name
# git cloneによりディレクトリが作られるので移動
cd project-name
# HEAD(masterブランチ)をorigin/masterに移動し、ワーキングツリーもreset
git reset --hard origin/master
ちょっと違うのが、git clone直後のHEADは何も指してない状態になっている。つまりワーキングツリーも空っぽの状態になっている。(.git
しかない状態)
なので、git reset --hard origin/master
で無理やりワーキングツリーの状態をorigin/masterの状態にする。なお、origin(リモート)はバンドルファイルを指している。
バンドルファイルの扱いは色々あるみたいで、これで良いのかはわからないけど、多分これが一番楽だと思います。
ただ、ある程度大きいプロジェクトだと辛いかもしれない。そもそも今時のプロジェクトはリモートリポジトリがあるはずですし、わざわざこんな方法は取る必要はないでしょう。
あと言うまでもないですが、信頼できるバンドルファイルに対して使いましょう。
その用途にgitはいらないのでは
「必要なファイルをコピーして送れるなら、わざわざgitを使わなくてもいいのでは」といえばそうなんですが、この方法は以下の点が良いです
- commitした時点の綺麗な状態を間違いなく作れるのが良い
- 履歴をさかのぼりたくなる時をカバーできる
逆に、もしここら辺にメリットに感じなかったら、この方法は使わなくてよいと思います。
参考にしました
7.12 Git のさまざまなツール - バンドルファイルの作成
ここではbundle create時にHEADを含めていたが、含めてもcloneした時点でワーキングツリーがmasterの時点になる事はなかった。.git/refs/heads/master
が無いのでそれが原因なような気はする。