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/

image.png (714.5 kB)

デフォルトのままで「Next」をクリックします。

image.png (20.3 kB)

Gitで使うデフォルトのテキストエディタを選択します。Windows環境なので、無難にVisual Studio Codeを選択しておきます(事前にVSCodeをインストールしておく必要があるかもしれません)。

image.png (19.8 kB)

GitコマンドをGit BashだけでなくWindowsコマンドプロンプトでも利用できるようにするか聞かれます。今回は、コマンドプロンプトでも利用できるように、真ん中のUse Git from the Windows Command Promptを選択しました。

image.png (25.9 kB)

HTTPSによる転送をどの方法で行うか聞かれます。今回は、OpenSSLを使うことにし、Use the OpenSSL libraryを選択しました。

image.png (19.1 kB)

コミット後、ソースコードUnixの改行コードに変換するかどうか聞かれます。今回は、Windowsで利用することを想定しているので、Checkout as-is, commit as-isを選択しました。

ただし、MacOSLinux OSでも利用することを想定している場合は、Checkout as-is, commit Unix-style line endingsにしておき、Unixの改行コードに統一しておくのが良いと思います。

image.png (26.1 kB)

デフォルトのままで「Next」をクリックします。

image.png (25.1 kB)

デフォルトのままで「Install」をクリックします。

image.png (24.2 kB)

以上でインストールは完了です。

クライアント側の設定

まずは、クライアント側で作業を行います。

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_rsaid_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

image.png (13.0 kB)

ベアリポジトリ(作業ディレクトリを持たないリポジトリ)を作成します。

# リポジトリの初期化
cd /c/repos/sample.git
git init --bare --shared

# Gitプロトコル時に共有レポジトリとして認識させる
touch git-daemon-export-ok

image.png (60.6 kB)

ベアリポジトリについては以下を参照のこと。
ベアリポジトリとノンベアリポジトリ:理論編〜GitでWordpressのテーマを管理
http://www.nekotricolor.com/entry/theory-of-bare-and-non-bare-repository-manage-wordpress-themes-with-git

3. SSH接続

SSHサーバを立ち上げます。まず、管理者としてGit Bashを実行します。

image.png (217.8 kB)

GitをインストールしたフォルダにSSHキーを作っていきます。Gitインストール直後は以下のようなファイル構成になっているはずです。 C:Program Files\Git\etc\ssh

image.png (47.9 kB)

パスフレーズは入力せずに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フォルダ内は以下のようになります。

image.png (67.8 kB)

続いて、sshd.exeを実行して、SSHサーバを立ち上げます。

/usr/bin/sshd.exe

ファイアウォールの設定を聞かれるので、「アクセスを許可する」をクリックします。

image.png (51.5 kB)

タスクマネージャーで確認すると、sshd.exeが起動していることが確認できると思います。

image.png (64.6 kB)

最後に、クライアント側で用意した公開鍵id_rsaをサーバ側に登録しておきます。

C:/Users/ユーザ名/.sshフォルダの直下にauthorized_keysというファイルを作成します。
ファイルをテキストエディタなどで開き、クライアント側で用意した公開鍵の内容をコピペします。

image.png (52.6 kB)

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 clonegit fetchgit pullはできるけど、git pushはできません。

--export-allをつけてリモートレポジトリにプッシュできるようにしておくように設定します。
また、--enable=receive-packをつけて、認証を受けていないanonymousユーザもプッシュできるようにします。

先ほどのコマンドを実行すると、ファイアウォールの確認画面が出てくるので、「アクセスを許可する」をクリックします。

image.png (54.4 kB)

クライアント側の設定

最後に、クライアント側で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

image.png (27.5 kB)

2. SourceTreeで管理する場合

コマンド操作でGitによるバージョン管理をしても良いですが、GUIを使うともっと便利です。今回はSourceTreeを使った例を示します。

まず、クライアント側で用意した秘密鍵id_rsaをSourceTreeに登録しておきます。[ツール] -> [オプション]からSSHキーを設定します。SSHクライアントにはOpenSSHを選択します。

image.png (62.9 kB)

3. SourceTreeでのGitリポジトリのクローン

SourceTree上でGitリポジトリのクローンを作成します。まず、新しいタブから「Clone」を選択し、クローンのURLを指定します。上記の例だと、ssh://192.168.86.21/c/repos/sample.gitになります。

image.png (97.3 kB)

「クローン」をクリックすると、対象のGitリポジトリのクローンを作成できます。

3. SourceTreeでコミットとプッシュを実行

GitリポジトリREADME.mdファイルを追加してコミットを行います。

image.png (136.4 kB)

続いて、プッシュを行います。プッシュをクリックすると、以下の画面が表示されるので、masterブランチを選択し、「プッシュ」をクリックします。

image.png (39.8 kB)

SSH接続がサーバ・クライアント間でできていれば、以下のようにプッシュが完了します。

image.png (156.2 kB)

トラブルシューティング

SourceTreeからのプッシュがいつまで立っても終わらない…

以下の設定を行うことで解決。

git config --global sendpack.sideband false

SourceTreeのPushが終わらない(社内ローカル +Windows環境)
https://teratail.com/questions/110660

参考

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/