目次
はじめに
先日、社内で「Windows ServerにGitサーバを立てたい」と相談を受けました。GitLabみたいなGitのホスティングサービスを使いたかったのですが、「Windows」という条件を考慮すると結構選択肢が絞られる…!
ということで、リッチなGUIは諦めて、Git for WindowsでGitサーバを構築することにしました。
できればユーザ管理もしたかったのですが、GitHubやGitLabが提供するような高度なユーザ管理機能はGit for Windowsには無いようなので、SSHの公開鍵認証を使うことにします。Gitへのpush時はユーザごとに鍵で認証することになるので、せめてコミット履歴にはユーザ情報が残せるはず!
今回は、Git for Windowsを使ってWindowsにGitサーバを構築し、SSH接続でアクセスするまでの手順をまとめたいと思います。
【クライアント・サーバ共通】前提
本当はサーバOSとしてWindows Serverを用意したかったのですが、すぐ用意できなかったので、とりあえずクライアントOSにGitサーバを構築してみます。クライアント、サーバともに、まずは以下の環境であることを前提とします。
- OSはWindows 10(64bit)
- Git for Windowsがインストール済み
また、クライアント環境では、以下のコマンドでGitの設定をしておくことをオススメします。
1 2 |
> git config --global user.email [eメールアドレス] > git config --global user.name [ユーザ名] |
【クライアント】SSHキーを生成する
冒頭でお話したとおり、今回はSSH接続でGitサーバにアクセスします。そのために、まずは以下のコマンドを実行してクライアントのSSHキーを生成します。パスフレーズは設定してもしなくてもOKです。
1 2 |
> cd C:\Users\[ユーザ名]\.ssh > ssh-keygen -t rsa |
上記コマンドを実行すると、.sshフォルダの下にid_rsa(秘密鍵)とid_rsa.pub(公開鍵)という2つのファイルが生成されます。
【サーバ】WindowsにGitサーバを構築する
リモートリポジトリを作成する
まずはリポジトリを作成します。
サーバ環境の任意の場所にリモートリポジトリ用のフォルダを作成します。「任意の場所」と書きましたが、ユーザディレクトリの配下ではない場所の方が良いです(おそらく)。(例えば、C:\repos\[リポジトリ名]など)
リポジトリ名は、慣例に従って末尾に「.git」を付加するようにしましょう。
次に、Git Bashを管理者権限で起動し、下記のコマンドを実行します。
Git Bashは、Git for Windowsをインストールすると自動的にインストールされているはずです。コマンドを実行すると、先程作成したフォルダがリポジトリとして初期化されます。
1 |
> git init --bare --shared=true |
環境変数を設定する
次に環境変数を設定します。以下のパスを環境変数に追加します。
- C:\Program Files\Git\cmd
- C:\Program Files\Git\usr\bin
- C:\Program Files\Git\bin
- C:\Program Files\Git\mingw64\bin
- C:\Program Files\Git\mingw64\libexec\git-core
SSHキーを生成する
サーバ側もSSHキーを生成しておきます。以下のコマンドを実行し、3種類のアルゴリズムで秘密鍵・公開鍵のセットを生成します。どれか一つでいい気もしますが、とりあえずね…。パスフレーズは入力せずに作成します。
1 2 3 4 |
> 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 |
SSHデーモンを起動する
次にsshd.exeを管理者権限で起動します。起動するsshd.exeのフルパスは以下です。
1 |
C:\Program Files\Git\usr\bin\sshd.exe |
起動時、ファイアウォールの設定を聞かれた場合は、「アクセスを許可する」をクリックします。実行後、タスクマネージャーを起動し、sshd.exeのプロセスがあることを確認しましょう。
クライアントの公開鍵をサーバに保存する
サーバ環境で、以下のフォルダの配下にauthorized_keysという名前のファイルを作成します。
1 |
C:\Users\[ユーザ名]\.ssh |
[ユーザ名]は任意のWindowsユーザアカウントです。Gitサーバにアクセスするユーザ(クライアント)の公開鍵を保管するために使用するので、Administrator的な立ち位置のユーザアカウントが良いかと思います。
authorized_keysファイルを作成したら、ファイルをエディタで開き、クライアントで生成した公開鍵(id_rsa.pub)の内容をコピペします。
これで完了です!
動作確認
それでは、クライアントからGitリポジトリにアクセスしてみましょう。以下のコマンドを実行し、Gitリポジトリをcloneしてみます。
1 |
> git clone ssh://[ユーザ名]@[GitサーバのIPアドレス]:[ポート番号]/c/repos/[リポジトリ名] |
[ユーザ名]は、authorized_keysを作成したフォルダのユーザアカウントです。
[ポート番号]はデフォルト(22番ポート)から変更していなければ、指定しなくてもOK。
[ポート番号]以降は、リポジトリフォルダへのパスを指定します。今回はC:\repos\[リポジトリ名]としてリポジトリを作成した場合の例です。
こんな感じでclone出来るはず!
おまけ:clone出来ない場合の対処法
ちなみにですが、私は以下のエラーでclone出来ない問題にぶち当たりました…。
1 2 |
bash: git-upload-pack: command not found fatal: Could not read from remote repository. |
どうも「git-upload-packなんて知らん」ということで怒られているようなのです。
git-upload-packコマンドは、クライアント環境でgit fetchしたときにリモート(サーバ環境)側で実行されるコマンドらしいのですが、git-upload-pack.exeはサーバ環境のC:\Program Files\Git\mingw64\binフォルダにちゃんと存在していて、かつ、さっき環境変数に設定してパス通したのになんでかな?という謎エラーでした。パス通したのに効かないなんてこともあるのですね。
対処法としては、clone時にオプションでgit-upload-packのパスを指定することで解決できました。
1 |
> git clone [URL] --upload-pack [サーバ側のgit-upload-packへのパス] |
でもこれ、毎回fetchするときにオプション指定しなくちゃならないのかい…?という疑問もあるかと思いますが、毎回やらなくてもいいように、git configで設定を書き込めます。
1 2 |
> cd [対象リポジトリのフォルダパス] > git config remote.origin.uploadpack [サーバ側のgit-upload-packへのパス] |
ただし、上記設定をした後は、サーバ側でsshdを再起動しましょう。
おわりに
今回はGit for WindowsでGitサーバを立ててみました。手順をまとめると結構簡単に出来ちゃうね?感が出てしまいましたが、構築の道中は細かく色々なことに躓いた気がします。個人的には、日頃GitLab(しかもサーバOSはLinux系)を使用しているのですが、Gitホスティングサービスは構築も簡単だしGUIもあるし、楽なんだなあ~と改めて感じました。
とはいえ、「WindowsにGitサーバを立てたい!」というニーズもあると思いますので、少しでもお役に立てましたら幸いです。
執筆者プロフィール

- tdi デジタルイノベーション技術部
- 社内の開発プロジェクトの技術支援や、新技術の検証に従事しています。主にアプリケーション開発系支援担当で、Java&サーバサイドが得意です。最近は、サーバーレスonAWSを推進しています。