9
10

More than 5 years have passed since last update.

Gitリポジトリの内容を別のマシンに送る時にgit bundleを使う

Last updated at Posted at 2019-02-28

手元のマシンで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が無いのでそれが原因なような気はする。

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10