FumipoSystem

プログラミングの学習記録やアプリのリリース情報について. ガジェットも好きなのでレビューするつもりです.

Gitとクラウドストレージで作るプライベートリポジトリ

はじめに

この記事は, データを複数のデバイス間で安全に同期・編集する方法を模索したものである. 現状, クラウドストレージとGitを組み合わせて, プライベートなリモートリポジトリを用意することで安全なデータ同期を実現できている. 課題は使用するストレージ容量と手間の増加である.

以前クラウドストレージだけでデータを同期していたころ, デバイス間で大規模なデータの衝突が起こり, 収集がつかなくなるという痛い思いをしたことが問題解決のモチベーションとなっている.

目次

  1. バイス間のデータの安全な同期
  2. Gitを利用した解決策
  3. 利点と欠点

データのバックアップ, 同期, バージョン管理

データのバックアップは重要性だ. デジタルデータは簡単に複製できるが, それと同じくらい簡単に永遠に失われるのものなのだから.
PCを構成しているパーツはいつ壊れるかわからないし, データもふとしたことで破損することがある.

データをバックアップするだけなら, 運営主体がしっかりしているところのクラウドストレージは大変便利だ.
しかし, データの同期が必要になったときにはしばしば問題が起こる. その問題は, ローカルとクラウドの同期のタイミングや, データ衝突時(コンフリクト)の解決策を細かく調整できないことから生じる.

異なるPC上で作業をすると一般にPCごとに異なるデータが作られるので, 最終的に一つのデータへと統合する作業が必要になる.
そのとき, 統合すべきところがファイル内に散らばり複雑な状況になると, それぞれ一体どのPCのデータを残せばいいのかよく分からなくなってくる. また, 意図せずデータを上書きしてしまい, 本当に必要なデータが失われる恐れがあるし, 最悪の場合にはそのことに気が付かないかもしれない.

バックアップと同期とは少しそれるが, 長期間作業を続けているとデータのバージョンを管理したくなってくる. データは時間とともに変化し, 異なる時間のデータは系統樹上に位置づけられるだろう. あるデータを様々な方法で加工することを試すとき, できたデータはそれぞれ加工前のデータから枝分かれした子孫となる. 作業が終わってしばらくした後, ふと当時の編集内容を思い出したくなることがある. 加工内容ごとに別の名前のファイルを作ってもいいが, 管理はどんどん大変になっていくだろう. そしておそらく, ファイル名を見たところでそれが何を意味するのか分からなくなるときが, 必ずやってくる.

データを安全に保存し, 共有と編集を行うにはどうしたらいいだろうか.

ナイーブな解決方法

ユーザーがデータの同期をコントロールする方法の一つは, データの編集が必要になるたびローカル環境に一時的なコピーを作るというものである. そして編集したデータをその都度クラウドストレージ上にアップロードすることでクラウドへと反映させる.

この方法の問題点は, クラウドストレージへのアップロードの手間である.
また, 編集したデータを漏れなく把握しサーバへアップロードしなければならない.

このような手間を最小にする方法は, 毎回ディレクトリをまるごとコピー・アップロードすることであるが, クラウドストレージサービスによっては, すでに存在しているものと同名のディレクトリをアップロードすることが不可能な場合がある.
また, 余計なネットワーク通信が発生するという問題もある.

Gitを用いた解決

同期のタイミングやコンフリクトの細かい制御を実現するために, ローカルPCにおいて, 同期対象のディレクトリに移動し, Gitの共有リポジトリとしてセットアップしておく.

cd <path to sync directory on local device>
git init --bare --share

そして, データの操作を行うディレクトリをローカルリポジトリとする.

cd <path to working directory>
git init
git remote add origin <path to sync directory above>

こうすると, 少なくともクラウド上のデータに異常が発生しても, 各PCにローカルリポジトリがあるのでデータが失われることは避けられる.

また, 同期を試みる際には共有リポジトリに対するpush・pullを介すこため, コンフリクトが発生する変更が加えられていれば必ず解決しなければならないようになっている.
Gitを用いることで変更のあったファイルは確実に補足されるし, .gitignoreファイルを設定することで, PCによって例外的に同期しないデータを管理することもできる.

f:id:fumipo-theta:20180629182958p:plain

共有リポジトリがGit Hubのサーバ上にあるのか, 個人が使用するクラウドストレージ上にあるのかという違いがあるが, 要するに, Git Hubのプライベートリポジトリを作るのと同じようなことである.

利点と欠点

利点

  • 共有リポジトリへのpush・pullにより同期タイミングを制御できる
  • commit時に同期する変更箇所を調整できる
  • データ変更を漏れなく補足できる
  • バージョン管理ができる

欠点

  • 共有リポジトリの分だけストレージを余分に使う
  • 同期の際にGitコマンドを使う手間がかかる

おわりに

MicrosoftGitHubを買収したので, OneDriveにgitのような機能が組み込まれてほしいと密かに祈っている.