git リポジトリのバックアップを作る

万が一gitで管理しているリポジトリ myrepos が消えてしまうと大変なのでこのリポジトリのバックアップを取ってみる。 まず myrepos のリポジトリのバックアップ先になる myrepos.git を作成して空のリポジトリを作成します。

$ mkdir myrepos.git
$ cd myrepos.git
$ git --bare init

次にバックアップ元のディレクトリに行ってバックアップ先に git push します。

$ cd ../myrepos
$ git push ../myrepos.git master

すると myreposリポジトリの履歴のみが myrepos.git にコピー作成されました。

次にこの履歴から clone コマンドでコピーしたリポジトリ myrepos.new を複製します。

$ cd ..
$ git clone myrepos.git myrepos.new
$ cd myrepos.new
$ ls
index.html

git cloneで作ったリポジトリではcloneしてきた元のリポジトリ(myrepos.git)と現在の手元のリポジトリ(myrepos.new)の両方のリポジトリを共有することになります。 単にcommitすると手元のmyrepos.newのリポジトリに変更を加え、git pushすることで大本のmyrepos.gitに対して変更を反映させる事が出来ます。

つまり一つのリポジトリ(myrepos.git)から複数 clone を作ってそれぞれ変更を加えても最終的には全ての変更が大本の myrepos.git に集約できることになります。

これは git の特徴である分散型バージョン管理システムと呼ばれている所以でもあるわけですね。 今回の例では手元(ローカル)に2つの myrepos と myrepos.git がありますが履歴のみのmyrepos.gitはどこかの遠いリモートにあってもssh等で接続すればネットワークを超えて履歴にアクセスする事ができます。

リモートの履歴からcloneする

このmyrepos.gitが存在するホスト以外のからcloneする事を考える。

$ git clone myhost:/path/to/myrepos.git myrepos.bak

ホスト名を付ける所以外cloneコマンドの書式と一緒である。 上の例では myhost はホスト名を表している。myhost上にある/path/to/myrepos.git 履歴から ローカルにmyrepos.bak の名前で作業用のリポジトリを作成しています。 手元に作業用リポジトリを取得した後は自分の好きなように変更を加えて git commit -am 'mycommit' します。

このままでは手元のリポジトリにしか変更内容が書き込まれませんので大元の myrepos.git に変更を反映させる必要があります。 それが push コマンドです。

$ git push

push を行う事でこのリポジトリのコピー元に変更を反映させる事ができます。 リポジトリ間の差分を埋める

一人でgitを使っている間はこれで問題ないのですが複数人数でリポジトリをcloneして利用すると自分以外の人のpushのタイミングによっては不整合が起こることがあります。 自分がcloneをして編集を加えている間に他の誰かがpushしてしまった時にその問題が起こります。 つまり自分のリポジトリにはその他の誰かがpushした内容は一切含まれないからです。

この様にリポジトリがコンフリクトした場合は git pull コマンドを利用します。 これは大元のリポジトリの内容と手元のリポジトリの内容の差分を埋めるときに使うコマンドです。

$ git pull

push を行う時にコンフリクトを起こし push 出来ない場合この pull コマンドが役に立つでしょう。

関連記事

gitで管理しないファイルを無視させる .gitignore

git(分散型バージョン管理システム)の基本的な使い方

created:

Back to top