Windows10パソコン上にGitサーバを立ててみた - LinuxサーバがないけどGitサーバを運用したい場合の対処法
はじめに
会社や研究室でGitを使ったバージョン管理システムを構築したいというニーズが少なからずあると思います。言うまでもなく、ソースコードやそれに付随する書類を管理する上で、手作業でそれを行うのは非常に非効率だからです。
今回は、Linuxサーバを持っておらず、Windows OSの入ったパソコンしか使えない場合を想定して、Windows10パソコン上にGitサーバをたてる方法について説明します。
WindowsパソコンにGitサーバを立てることはまずやらないためか、ネット上での情報が少なく、公開されている情報も断片的だと感じたので、今回私なりにまとめてみることにしました。
実行環境
- Gitサーバ (Windows10 Pro)
- Gitクライアント (Windows10 Pro)
Gitのインストール(サーバ・クライアント共通)
サーバ(Windows10)とクライアント側(Windows)の両方の環境にGitをインストールします。
まず、以下のGitのサイトからGitのインストーラをダウンロードしてきます。
https://git-scm.com/
デフォルトのままで「Next」をクリックします。
Gitで使うデフォルトのテキストエディタを選択します。Windows環境なので、無難にVisual Studio Codeを選択しておきます(事前にVSCodeをインストールしておく必要があるかもしれません)。
GitコマンドをGit BashだけでなくWindowsのコマンドプロンプトでも利用できるようにするか聞かれます。今回は、コマンドプロンプトでも利用できるように、真ん中のUse Git from the Windows Command Prompt
を選択しました。
HTTPSによる転送をどの方法で行うか聞かれます。今回は、OpenSSLを使うことにし、Use the OpenSSL library
を選択しました。
コミット後、ソースコードをUnixの改行コードに変換するかどうか聞かれます。今回は、Windowsで利用することを想定しているので、Checkout as-is, commit as-is
を選択しました。
ただし、MacOSやLinux OSでも利用することを想定している場合は、Checkout as-is, commit Unix-style line endings
にしておき、Unixの改行コードに統一しておくのが良いと思います。
デフォルトのままで「Next」をクリックします。
デフォルトのままで「Install」をクリックします。
以上でインストールは完了です。
クライアント側の設定
まずは、クライアント側で作業を行います。
1. Gitのグローバル設定
Git Bashもしくはコマンドプロンプトを開き、以下のコマンドを実行します。メールアドレスとユーザ名については任意の値を設定してください。
# ユーザ設定 git config --global user.email "administrator@example.com" git config --global user.name "Administrator" # 日本語名を表示するための設定 git config --global core.quotepath false # Windows から git プロトコルで push するとハングアップするのを防止 git config --global sendpack.sideband false
2. SSHキーの用意
今回はGitプロトコルによる通信ではなく、SSHによる通信方法を使います。理由は、Gitプロトコルでの通信だと専用のポート (9418)を使っての通信になり、環境によっては ウイルス対策ソフトのファイアウォールに引っかかるためです。また、Gitプロトコルの場合、Windows環境ではリポジトリのクローン時にエラー(Index-pack failed
)が発生することがあると確認しています。
Gitサーバの通信プロトコルについての詳細は以下を参照のこと。
https://git-scm.com/book/ja/v1/Git-サーバー-プロトコル
クライアント側でSSHキー(公開鍵と秘密鍵)を作成しておきます。-C
オプションで指定しているメールアドレスは任意のものを設定してください。
以下ではGit Bashで実行した際のコマンドを示しました。以下のssh-keygen
コマンドを実行します。
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
実行すると、id_rsa
とid_rsa.pub
という2つのファイルが生成されているはずです。
このうち、公開鍵であるid_rsa.pub
は、サーバ側にわたす必要があります。
サーバ側の設定
ここからはサーバ側の操作になります。
1. Gitのグローバル設定
クライアント側のときと同様に、Git Bashもしくはコマンドプロンプトを開き、以下のコマンドを実行します。メールアドレスとユーザ名については任意の値を設定してください。
# ユーザ設定 git config --global user.email "administrator@example.com" git config --global user.name "Administrator" # 日本語名を表示するための設定 git config --global core.quotepath false # Windows から git プロトコルで push するとハングアップするのを防止 git config --global sendpack.sideband false
2. リポジトリを作成する
以下の場所(もちろん、任意の場所で構いません)に、リモートレポジトリを作成していきます。
フォルダの種類 | サンプルパス |
---|---|
ベースフォルダ | C:\repos |
リモートリポジトリ | C:\repos\sample.git |
以下では、Git Bashでの操作を示しました。Cドライブの直下にレポジトリ用のフォルダを用意します。
mkdir /c/repos mkdir /c/repos/sample.git
ベアリポジトリ(作業ディレクトリを持たないリポジトリ)を作成します。
# リポジトリの初期化 cd /c/repos/sample.git git init --bare --shared # Gitプロトコル時に共有レポジトリとして認識させる touch git-daemon-export-ok
ベアリポジトリについては以下を参照のこと。
ベアリポジトリとノンベアリポジトリ:理論編〜GitでWordpressのテーマを管理
http://www.nekotricolor.com/entry/theory-of-bare-and-non-bare-repository-manage-wordpress-themes-with-git
3. SSH接続
SSHサーバを立ち上げます。まず、管理者としてGit Bash
を実行します。
GitをインストールしたフォルダにSSHキーを作っていきます。Gitインストール直後は以下のようなファイル構成になっているはずです。
C:Program Files\Git\etc\ssh
パスフレーズは入力せずにEnterを押して、SSHキーを作っていきます。
cd /c/'Program Files'/Git/etc/ssh ssh-keygen -t rsa -f ssh_host_rsa_key ssh-keygen -t ecdsa -f ssh_host_ecdsa_key ssh-keygen -t ed25519 -f ssh_host_ed25519_key
作成すると、Git/etc/ssh
フォルダ内は以下のようになります。
続いて、sshd.exe
を実行して、SSHサーバを立ち上げます。
/usr/bin/sshd.exe
ファイアウォールの設定を聞かれるので、「アクセスを許可する」をクリックします。
タスクマネージャーで確認すると、sshd.exe
が起動していることが確認できると思います。
最後に、クライアント側で用意した公開鍵id_rsa
をサーバ側に登録しておきます。
C:/Users/ユーザ名/.ssh
フォルダの直下にauthorized_keys
というファイルを作成します。
ファイルをテキストエディタなどで開き、クライアント側で用意した公開鍵の内容をコピペします。
4. 外部接続を行うGit Daemonの起動(SSH接続では必要ない)
Gitプロトコルで通信を行う場合は、以下のコマンドでGitサーバを立ち上げておく必要があります。
# git daemon --verbose --export-all --enable=receive-pack --base-path=/c/repos/ git daemon --verbose --reuseaddr --export-all --enable=receive-pack --enable=upload-pack --base-path=/c/repos/
デフォルトは読み取り専用になっています。つまり、git clone
、git fetch
、git pull
はできるけど、git push
はできません。
--export-all
をつけてリモートレポジトリにプッシュできるようにしておくように設定します。
また、--enable=receive-pack
をつけて、認証を受けていないanonymousユーザもプッシュできるようにします。
先ほどのコマンドを実行すると、ファイアウォールの確認画面が出てくるので、「アクセスを許可する」をクリックします。
クライアント側の設定
最後に、クライアント側でGitリポジトリのクローンの作成とGitリポジトリへのプッシュができるか確認します。
1. クローンの作成
ipconfig
であらかじめIPアドレスを確認しておきます。
以下では、IPアドレスが192.168.86.21
、サーバ側のGitのリモートレポジトリがC:/repos/sample.git
だった場合の例を示しました。
コマンドプロンプトで以下のコマンドを実行しました。
git clone ssh://192.168.86.21/c/repos/sample.git
2. SourceTreeで管理する場合
コマンド操作でGitによるバージョン管理をしても良いですが、GUIを使うともっと便利です。今回はSourceTreeを使った例を示します。
まず、クライアント側で用意した秘密鍵id_rsa
をSourceTreeに登録しておきます。[ツール] -> [オプション]からSSHキーを設定します。SSHクライアントにはOpenSSH
を選択します。
3. SourceTreeでのGitリポジトリのクローン
SourceTree上でGitリポジトリのクローンを作成します。まず、新しいタブから「Clone」を選択し、クローンのURLを指定します。上記の例だと、ssh://192.168.86.21/c/repos/sample.git
になります。
「クローン」をクリックすると、対象のGitリポジトリのクローンを作成できます。
3. SourceTreeでコミットとプッシュを実行
GitリポジトリにREADME.md
ファイルを追加してコミットを行います。
続いて、プッシュを行います。プッシュをクリックすると、以下の画面が表示されるので、masterブランチを選択し、「プッシュ」をクリックします。
SSH接続がサーバ・クライアント間でできていれば、以下のようにプッシュが完了します。
トラブルシューティング
SourceTreeからのプッシュがいつまで立っても終わらない…
以下の設定を行うことで解決。
git config --global sendpack.sideband false
SourceTreeのPushが終わらない(社内ローカル +Windows環境)
https://teratail.com/questions/110660
Gitサーバに繋がらない…
Gitがクローンできない理由として、Windowsのユーザ認証が邪魔をしている可能性があります。
IPアドレスの前にログインユーザ名(サーバ側)、IPアドレスの後ろにSSHのポート番号を指定して実行するとうまくいきます。
git clone ssh://imama@192.168.86.31:22/c/repos/sample.git
参考
Windows Server上にGitリモートリポジトリを導入する手順書
https://qiita.com/nipoko/items/6e81a6021358ff8c03e9
WindowsのGitサーバ(リモートリポジトリ)構築メモ
http://nosource.blog35.fc2.com/blog-entry-142.html
gitで日本語ファイル名を表示する方法
https://qiita.com/kozo/items/08dc2b86ae3ba3f282c3
How to fix Windows 7 64 Bit git push msysgit hang up Problem
https://weberde.wordpress.com/2013/02/06/how-to-fix-windows-7-64-bit-git-push-msysgit-hang-up-problem/