NAS上にリモートリポジトリを作成しgit運用する

状況

  • git管理したいプロジェクトが手元にある
  • githubのようなオンラインではなくNASにリモートリポジトリをつくりたい
  • 手元のプロジェクトが吹っ飛んだとき用のバックアップとしても機能させたい

手順

  1. gitのインストール
  2. Localにある管理したいプロジェクトのgit化
  3. LocalなプロジェクトをNAS上にクローン
  4. NAS上のノンベアリポジトリをクローンしベアリポジトリの作成
  5. ノンベアリポジトリに登録されているリモートリポジトリを削除し、代わりにノンベアリポジトリを登録する
  6. Localのプロジェクトに登録されているリモートリポジトリをNAS上のノンベアリポジトリにする
  7. ベアリポジトリのhookを使い、プルされたらノンベアリポジトリも更新されるようにする

1. gitのインストール

私家版 Git For Windowsのインストール手順を参考にインストール

私の場合、□Windows Explorer Integration外す、Use Git from the Windows Command Prompt、Checkout as-is, commit as-is、Use MinTTY、□Enable file system caching □Enable Git Credential Managerをオンにしてインストール

2. Localにある管理したいプロジェクトのgit化

SourceTree等をインストールして、新規/Cloneを作成 -> リポジトリを作成 でGitでリポジトリを作成する。

3. LocalなプロジェクトをNAS上にクローン

新規/クローンを作成 -> リポジトリをクローン からLocalなプロジェクトをNAS上にクローンする。SourceTreeの場合パスの¥(バックスラッシュ/エン)をすべて/(スラッシュ)に変更する必要がある。

4. NAS上のノンベアリポジトリをクローンしベアリポジトリの作成

このままではプッシュすると updating the current branch in a non-bare repository remote: error: is denied と怒られプッシュ出来ない。クローンしてNAS上に作成したのはノンベアなリポジトリであり、ベアなリポジトリにプッシュするようにしないといけない。

ベア、ノンベアについてはベアリポジトリとノンベアリポジトリ:理論編〜GitでWordpressのテーマを管理が分かりやすかった。

更新情報だけを持っている ワーキングディレクトリとは、ファイルそのものがあるディレクトリのこと。 つまりリポジトリが作業用(non-bare)と更新管理用(bare)に分かれてるわけですね。

ここからはベアリポジトリとノンベアリポジトリ:実践編〜GitでWordPressのテーマを管理gitで自動デプロイ環境構築(bare,hook)を参考。

git bash等を立ち上げ、NAS上にリポジトリまで移動する。コマンドでのネットワークドライブへの移動はnet useやpushd等を使う。
参考 * ネットワークドライブの割り当て方法 * 【コマンドプロンプト】ネットワークドライブの割り当て * コマンド プロンプトから直接ネットワーク ドライブにアクセスする方法

ここではNAS上のノンベアリポジトリの場所をZ:\projects\Sample、ベアリポジトリの場所をZ:\projects\.Sample.git とする。

cd z:/projects/
mkdir .Sample.git #ベアリポジトリのフォルダの作成
cd .Sample.git/
git clone --bare ../Sample/ .

実行結果

$ git clone --bare ../Sample/ .
Cloning into bare repository '.'...
done.

5. ノンベアリポジトリに登録されているリモートリポジトリを削除し、代わりにノンベアリポジトリを登録する

cd ../Sample/
git remote -v

リモートリポジトリを確認するとcloneしてきたためLocalなプロジェクトが登録されているのが分かる

git remote rm origin
remote add origin ../.Sample.git/
git remote -v

これで以下の表示が出れば成功

$ git remote -v
origin  ../.Sample.git/ (fetch)
origin  ../.Sample.git/ (push)

6. Localのプロジェクトに登録されているリモートリポジトリをNAS上のノンベアリポジトリにする

SourcdTreeのリポジトリ設定よりノンベアリポジトリ(.Sample.git)のパスを入れて登録。

7. ベアリポジトリのhookを使い、プルされたらノンベアリポジトリも更新されるようにする

hookを使うことでいろいろと自動化できるらしい。

hookのスクリプト.Sample.git/hooksに入っています。今回はプッシュされたタイミングなのでpost-receiveを使うらしい。

cd ../.Sample.git/hooks/
vi post-receive #post-receiveを作成して編集

以下のコマンドを作成。viのコマンドはvi コマンドリファレンス等を参照。
lで入力開始、:wqで保存して終了)

#!/bin/sh
cd ../Sample || exit
unset GIT_DIR
git pull origin master

viを終了したら実行権限を付ける

chmod +x post-receive