SynologyのNAS “DiskStation”でGitサーバーを構築する

Synology製のNAS DiskStation DS115を使っているのですが、ファイルサーバー以外にもDLNAサーバーやWordPressのサーバーとしても使えて、とても重宝しています。 今回はDiskStation DS115をGitサーバーとして使ってみようと思い、悪戦苦闘したことを書いていきます。

Git Server

DiskStationの管理画面から、パッケージセンターの中に「Git Server」というアプリケーションがあります。これによりDiskStationをGitサーバーとして動作させることができます。 早速インストールし、Git Serverを起動しました。 起動する際にSSHを有効にする必要がありますが、起動時にSSHが無効であれば、有効にするように促されます。

Git Serverの設定画面はいたってシンプル

Git Serverを開くと、ユーザーの一覧とアクセスの許可・拒否の選択しかありません。 残念ながらこの画面でリモートリポジトリを配置するフォルダを決定したり、設置したりすることはできません。 Git Serverの画面 シンプルすぎて、全然機能が足りません!

ヘルプが全然分からない

一応Git Serverのヘルプはあるのですが、 Git Serverヘルプ
  1. Rootまたはadminとして、SSH を介して Synology サーバーにログインします。
  2. ディレクトリをフォルダを作成する /volumeX に変更します。X はボリューム番号です。例えば、「git_repos」となります。フォルダの権限は Linux と同じです。
  3. そのフォルダで git init を実行し、空白のリポジトリを作成してください。
  4. リポジトリが作成されたら、Git クライアント ユーザーは次のコマンドを使ってこのリポジトリにアクセスできるようになります。 git clone ssh://[Git ユーザー]@[あなたの Synology サーバーの IP アドレスかホスト名]/[Git リポジトリのパス]
この説明でどう分かれというのか。 「SSHを介してSynologyサーバーにログイン」するのはどうやればできるんだ? IPアドレスはLANのものを使えば良いので分かるのですが、SSHを介してRootでログインする方法がわからず途方に暮れていました。 しかし、Google検索でやっと方法が分かりました。

SynologyサーバーへSSHでログインする

ターミナルを起動し、 $ ssh root@<LAN上のDiskStationのIPアドレス> と打ち込むと、パスワード入力後にSSHを介したSynologyサーバーへのログインに成功しました。

SSHでGitリモートリポジトリを作成する

SSHでは、lsではなくdirでディレクトリ一覧が表示されるので戸惑いました。 また、どこにGit用のディレクトリを作成し、リモートリポジトリを作成させるかが分かりませんでした。 ああでもない、こうでもないとやっていましたが、一番上の階層まで行き、Git_practice2(名前はお好きなように)ディレクトリを作成し、そこにGitリポジトリを作成しました。 diskstation> cd ../ diskstation> mkdir Git_practice2 diskstation> git init

SourceTreeでリモートリポジトリをクローン

SourceTreeは、GUIベースのGitツールで、ステージやコミット、プルやプッシュなどが直感的に扱えるため、他の作業に専念できます。 リモートリポジトリを作成したので、そこへアクセスするためにリポジトリをローカルにクローンします。 SourceTreeの「新規リポジトリ」から、「URLをクローン」する方法でリポジトリをローカルに持ってきます。 リモートリポジトリをクローン ソースURLには、「ssh://<Gitユーザー名>@<SynologyのIPアドレス>/<作ったディレクトリの名前>」を入力します。上の画面と同じではありません。 保存先のパスには、ローカルに格納する空っぽのフォルダを、 名前はこのリポジトリの名前を記入します。 ソースURLの指定が正しければ、「ソースパス、またはソースURLとして正しくありません」が、「これはGitリポジトリです」に変わります。

いざ、ファイルをフォルダーにコピー+ステージ+コミット+プッシュ

ローカルにクローンしたリポジトリのフォルダに、ファイルをコピーし、ステージへ移動し、コミットしました。 そしてプッシュをするのですが、うまくいきません。 git insufficient permission for adding an object to repository database のようなエラーが発生しました。 またGoogleで検索して出てきたページによると、リモートリポジトリにある.git/ディレクトリの権限に問題があるとのこと。 .git/というディレクトリはリポジトリなどを管理するので、非常に大事なディレクトリです。そこが書き込み不能だったので、プッシュできなかったというわけです。 またターミナルに戻り、.git/の権限を変更しました。 chmod -R 777 .git これで.git/ディレクトリの中身が全部読み書き更新可能になるのですが…ゲストにまで書き込み許可を与えるのは非常に抵抗を感じます。

またプッシュできない!

今度は違うエラーメッセージが発生して、プッシュできません。 remote: error: refusing to update checked out branch: refs/heads/master remote: error: By default, updating the current branch in a non-bare repository remote: error: is denied, because it will make the index and work tree inconsistent remote: error: with what you pushed, and will require 'git reset --hard' to match remote: error: the work tree to HEAD. remote: error: remote: error: You can set 'receive.denyCurrentBranch' configuration variable to remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into remote: error: its current branch; however, this is not recommended unless you remote: error: arranged to update its work tree to match what you pushed in some remote: error: other way. remote: error: remote: error: To squelch this message and still keep the default behaviour, set remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse’. 長い。何を言われているのかさっぱり分かりません。 これも検索してみると、「リモートリポジトリの設定 core.bare が有効になっていない」のが原因だという。 この設定を変更してみることにしました。またターミナルに戻り、 $ git config --bool core.bare true とタイプして、core.bareという設定を有効にしました。 すると…正常にプッシュできました! これにより、DiskStation上のリモートリポジトリをローカルにクローンして、ローカルでの作業を行い、ステージ+コミットを行って履歴を作成することができ、プッシュすることでDiskStationでプロジェクトを集中管理することができるようになりました。 Source Treeの画面 今Mac1台だけなので、リモートリポジトリを作る意味はないかもしれません。しかしローカルのリポジトリにあるファイルが壊れてしまったり、2台以上のMacをLANで接続して別々の作業をやることになったりすれば、威力を発揮できるかもしれません。

参考になった記事

参考になる記事、ありがとうございました。