【ひとりGit活用術】ローカルGit bareリポジトリとSyncthingによるEclipseの複数PC間同期

Posted by 雅楽斎 on Wednesday, February 5, 2020

TOC

ScoopでのオレオレBucketで必要になったgitリポジトリを無理やりSyncthingで同期する方法について、もっと汎用的にGitで管理されているEclipseのプロジェクトを複数PC間(異OS間)で共有する方法についてまとめます。

Syncthingでのディレクトリ同期については以下をご参照下さい。

マルチプラットフォームファイル同期ソフトSyncthingのご紹介

前提条件

Syncthingによる同期は絶対に複数から同時に走らせない(復旧できない)

同期の順序が明確であればgitで衝突を検知できますが、同時に同期が走ると間違いなくgitのファイルがぐちゃぐちゃになるので復旧ができません。こうなると恐らく復旧手段がないので、この方法で複数人での利用は不可能な方法です。

例としてEclipseプロジェクトを管理する

これは単に私が慣れているから…Eclipseに限らずディレクトリ単位でプロジェクトを管理する形態であればなんでも大丈夫なはずです。今回はMavenプロジェクトを管理します。

1プロジェクトを1gitリポジトリとして管理する

やりようによっては1つのリポジトリで複数のプロジェクトを管理できますが、CVS(RCS)の時代からは変わって変更履歴はファイル単位ではなくリポジトリ単位で記録されるので1プロジェクト1リポジトリで管理します。

リポジトリのバックアップ/アーカイブ化

バックアップ/アーカイブ化はgit remoteを使って他のサービスにpushするほか、Syncthingで管理されているgitリポジトリを含むディレクトリをtxzで固めることでも実現可能です。

リポジトリの削除

プロジェクトごと消したい場合はSyncthingで管理しているbareリポジトリのディレクトリを削除します。

Eclipseのプロジェクト設定で文字コードはUTF-8、改行コードはLFに統一する

Eclipseの柔軟な仕様で、文字コードと改行コードはプラットフォームネイティブを使用するのがデフォルトになっていますが、複数OS間で共有することを考えるとメリットが皆無なので、Eclipseのプロジェクトの設定で明示的に指定します。

作業全体像

sequenceDiagram title: SyncthingとEclipseを使った同期 participant a as PC1 participant b as Syncthing participant c as PC2 Note over a,c: 前提:PC1とPC2でSyncthingの同期が取れている a->>a: Syncthing管理下で
ディレクトリ作成 a->>a: git init activate a Note over a: Eclipse上で作業 a->>a: プロジェクト作成 a->>a: gitリポジトリをclone a->>a: プロジェクトをgit
リポジトリに追加 a->>a: git commit/
git push deactivate a Note over a: git pushでbare
リポジトリが更新 b->>a: 差分取得 a-->>b: 差分 b->>c: 差分反映 c-->>b:   Note over a,c: bareリポジトリが同期 activate c Note over c: Eclipse上で作業 c->>c: プロジェクトをgit
リポジトリからimport c->>c: 変更/git commit/
git push deactivate c Note over c: git pushでbare
リポジトリが更新 b->>c: 差分取得 c-->>b: 差分 b->>a: 差分反映 a-->>b:   Note over a,c: bareリポジトリが同期 activate a Note over a: Eclipse上で作業 a->>a: git pull a->>a: 変更/git commit/
git push deactivate a Note over a: git pushでbare
リポジトリが更新 b->>a: 差分取得 a-->>b: 差分 b->>c: 差分反映 c-->>b:   Note over a,c: bareリポジトリが同期。以降繰り返し

PC1(新規プロジェクト作成)側の作業

使用するディレクトリは以下とします。

ディレクトリ設定値
Syncthingの管理ディレクトリ~/Syncthing/Repositories
作成するgit bareリポジトリ~/Syncthing/Repositories/git-repos/SharedBareRepository.git
bareリポジトリをcloneするディレクトリ~/git/SharedBareRepository
Eclipseのプロジェクト名SharedBareRepository

git bareリポジトリの作成

$ cd ~/Syncthing/Repositories/git-repos/
$ mkdir SharedBareRepository.git
$ cd SharedBareRepository.git/
$ git init --bare --shared

こうするとSharedBareRepository.gitの中身はこうなります。

SharedBareRepository.git/
├── HEAD
├── branches
├── config
├── description
├── hooks
├── info
├── objects
└── refs

使い終わってリポジトリを削除する場合はSharedBareRepository.git/ディレクトリを削除すればOKです1

Eclipseでのプロジェクト作成(gitとは無関係)

Mavenプロジェクトの作成

Eclipseでプロジェクトを作成。今回はMavenプロジェクトで進めます。どんなプロジェクトでも手順に違いはありません。MavenのArchetypeとプロジェクト設定値は以下で進めます。

設定箇所設定値
ArchetypeのGroup Idorg.apahe.maven.archetypes
ArchetypeのArtifact Idmaven-archetype-quickstart
プロジェクトのGroupIdtk.rohead
プロジェクトのArtifact Id(プロジェクト名)SharedBareRepository

メニューからFile→New→Other…と辿ると作成するプロジェクトを選ぶウィザードが表示されます。

Maven→Maven Projectを選んでNext

今回はそのままNextで進みます。

Filterにmaven-archetype-quickstartを入力して、ArchetypeはGroup Idがorg.apahe.maven.archetypes、Artifact Idがmaven-archetype-quickstartのものを選びます。

GroupIdは重複しないFQCN(ここではtk.rohead)、Artifact IdはSharedBareRepositoryにします。

これで作られたプロジェクトはビルドできる状態のはずなので、ネットに繋がっていて確認したい場合はpom.xmlを右クリック→Run As→Maven installでjarが生成されます。

プロジェクト設定(文字コードと改行コードの指定)

プロジェクト設定を開くので、プロジェクト(フォルダアイコン)を右クリックしてPropertiesを選ぶとプロジェクトの設定ダイアログが開きます。

Resourceとして表示されている中のText file encodingの設定値をOtherにしてUTF-8を選びます。

New text file line delimiterの設定値をOtherにしてUnixを選びます。

この2つはInherited from containerにしてしまうと違うOS(Windows)で開いた時にMS932とCRLFにされる結果良いことが何一つないので特に文字コードは絶対にUTF-8を指定、改行コードはLFかCRLFどちらかを指定して明示的に統一しましょう。

Eclipseでのgitリポジトリ操作(clone)

bareリポジトリをEclipseから扱えるようにするので、一旦PerspectiveをGitに変更します。メニューのWindow→Perspective→Open Perspective→Other…を選ぶとOpen Perspectiveダイアログが表示されます。

Gitを選んでOpenを選ぶとEclipse全体がEGitのPerspectiveに切り替わります。

左ペインの中からClone a Git Repositoryを選ぶか、その右上にある取り込むようなアイコンを押すと、Clone Git Repositoryダイアログが表示されます。

LocationのURIの右にあるLocal Fileを選んで、Syncthingの中の作成したbareリポジトリの.gitディレクトリ(~/Syncthing/Repositories/git-repos/SharedBareRepository.git)を選びます。

Branch Selectionでは空になっているのでそのままNext。

Local Destinationではclone先のディレクトリが選ばれているので不都合がなければそのままFinishすると、左ペインにbareリポジトリをcloneしたgitリポジトリが追加されます。

Perspectiveを戻すので、右上のJavaを選ぶかWindow→Perspective→Open Perspective→Other…でJavaを選びます。最近使用したPerspectiveは右上に表示されるので前者の方法が楽だと思います。

cloneしたリポジトリへのEclipseプロジェクトの追加

左ペイン(Package Explorer)に表示されているプロジェクト(フォルダアイコン)を右クリックしてTeam→Share Projectを選びます。

最近のEclipseであればEGitになるので、Repository:の一番右にあるCreateを選びます。

Create a Git RepositoryでRepository directoryの右にあるBrowseを選んで、上でcloneしたディレクトリを選びます。

戻るとリポジトリが反映されているので、そのままFinishを押します。

左ペインでgitリポジトリに登録されていないファイルが青と>で表示されるようになるので、これらのファイルをgitリポジトリにcommitします。

プロジェクト(フォルダアイコン)を右クリックして、Team→Synchronize Workspaceを選びます2

Team Synchronizing Perspectiveに切り替える確認ダイアログが表示された後、commit候補が表示されるので、確認したらプロジェクト(フォルダアイコン)を右クリックしてCommitを選びます。

右下のGit Stagingタブにcommit内容が表示されているので、タブをダブルクリックして広げましょう。

左上のUnstaged Changesに入っているファイルはcommitされないので、左下のStaged Changesに入れるのにドラッグするか右上の+を押します。(git add相当の操作)

右側のCommit Messageにコミットメッセージを入力後、右下のCommit and Pushでbareリポジトリに反映します。CommitとPushは別々でも問題ありません。commitはcloneしたリポジトリへの反映、pushはSyncthingが管理しているbareリポジトリへの反映になるので、pushが終わってSyncthingでの同期が行われると他のPCからもgit pullで反映できるようになります。

Push先のブランチを指定するので、特に何もなければそのままmasterブランチで進めます。確認ダイアログが表示されるので、そのままFinishを押すとgit pushの結果が表示されます。

これでgitのbareリポジトリのファイルが更新されるので、Syncthingが同期するのを待ちます。

PC2(作成プロジェクトを利用)側の作業

PC1側でSyncthingディレクトリへ同期させたプロジェクトを別のPCから利用します。

とはいえ、リポジトリの作成とプロジェクトの追加は終わっているので、Syncthingが同期したbareリポジトリをcloneして、その中のEclipseプロジェクトをimportするだけです。これはEclipse上で簡単にできます。3

git bareリポジトリのclone

PC1での作業と同じ様にメニューのWindow→Perspective→Open Perspective→Other…を選びます。

Open Perspectiveダイアログが表示されたらGitを選んだ状態でOpen。

同じ様に左ペインからClone a Git repositoryかその上にある取り込むようなボタンを選びます。

Locationの右側にあるLocal Fileボタンを選び、Syncthingで管理しているbareリポジトリを選びます。

Branch Selectionではmasterブランチが既にあるので、選ばれていることを確認してNext。

Local Destinationは同じ様にclone先のディレクトリを指定してくるので、問題ないことを確認したらFinish。

cloneが終わったらGitリポジトリとしてプロジェクトが手元にあることを確認できます。

右上のボタンでJava Perspectiveに戻ります。

Eclipseプロジェクトのimport

cloneしたgitリポジトリからEclipseプロジェクトをimportするので、左ペイン(Package Explorer)のImport projects…か メニューのFile→Import…を選びます。

import方法を聞かれるので、Git→Projects from Gitを選んでNext。

Existing local repositoryを選んでNext。

cloneしたリポジトリが表示されているので、選んでNext。

Eclipseのプロジェクトがそのままあるので、「Import existing Eclipse projects」が選ばれていることを確認して下に表示されているSharedBareRepositoryを選んでNext。

プロジェクトが問題なく取り込めていればチェックが付いた状態になっているので、そのままFinish。

左ペイン(Package Explorer)にimportされたgitリポジトリがあるので、必要に応じて編集を行います。変更後のcommit以降の流れはPC1と同じなので省略します。

という訳でご紹介しましたがいかがでしょうか。これを使えば多人数での共同作業は無理ですが一人での複数場所での開発には恐らく耐えられる(git管理されているので、git pullしてcommitログを見ればどれが反映されているか確認できる)のではないかと思います。

スポンサーリンク


  1. Syncthing管理下にあるので、削除すると同期先でもリポジトリが削除されます。 [return]
  2. おまかせで全部登録する場合はTeam→Commitでも可) [return]
  3. 厳密にはgit initもEclipse上でできるんですが慣れてないので… [return]

comments powered by Disqus