WindowsにGitサーバを構築してSSHでアクセスする

Pocket

はじめに

先日、社内で「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サーバを構築してみます。クライアント、サーバともに、まずは以下の環境であることを前提とします。

また、クライアント環境では、以下のコマンドでGitの設定をしておくことをオススメします。

【クライアント】SSHキーを生成する

冒頭でお話したとおり、今回はSSH接続でGitサーバにアクセスします。そのために、まずは以下のコマンドを実行してクライアントのSSHキーを生成します。パスフレーズは設定してもしなくてもOKです。

上記コマンドを実行すると、.sshフォルダの下にid_rsa(秘密鍵)とid_rsa.pub(公開鍵)という2つのファイルが生成されます。

【サーバ】WindowsにGitサーバを構築する

リモートリポジトリを作成する

まずはリポジトリを作成します。

サーバ環境の任意の場所にリモートリポジトリ用のフォルダを作成します。「任意の場所」と書きましたが、ユーザディレクトリの配下ではない場所の方が良いです(おそらく)。(例えば、C:\repos\[リポジトリ名]など)

リポジトリ名は、慣例に従って末尾に「.git」を付加するようにしましょう。

次に、Git Bashを管理者権限で起動し、下記のコマンドを実行します。

Git Bashは、Git for Windowsをインストールすると自動的にインストールされているはずです。コマンドを実行すると、先程作成したフォルダがリポジトリとして初期化されます。

環境変数を設定する

次に環境変数を設定します。以下のパスを環境変数に追加します。

  • 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種類のアルゴリズムで秘密鍵・公開鍵のセットを生成します。どれか一つでいい気もしますが、とりあえずね…。パスフレーズは入力せずに作成します。

SSHデーモンを起動する

次にsshd.exeを管理者権限で起動します。起動するsshd.exeのフルパスは以下です。

起動時、ファイアウォールの設定を聞かれた場合は、「アクセスを許可する」をクリックします。実行後、タスクマネージャーを起動し、sshd.exeのプロセスがあることを確認しましょう。

クライアントの公開鍵をサーバに保存する

サーバ環境で、以下のフォルダの配下にauthorized_keysという名前のファイルを作成します。

[ユーザ名]は任意のWindowsユーザアカウントです。Gitサーバにアクセスするユーザ(クライアント)の公開鍵を保管するために使用するので、Administrator的な立ち位置のユーザアカウントが良いかと思います。

authorized_keysファイルを作成したら、ファイルをエディタで開き、クライアントで生成した公開鍵(id_rsa.pub)の内容をコピペします。

これで完了です!

動作確認

それでは、クライアントからGitリポジトリにアクセスしてみましょう。以下のコマンドを実行し、Gitリポジトリをcloneしてみます。

[ユーザ名]は、authorized_keysを作成したフォルダのユーザアカウントです。

[ポート番号]はデフォルト(22番ポート)から変更していなければ、指定しなくてもOK。

[ポート番号]以降は、リポジトリフォルダへのパスを指定します。今回はC:\repos\[リポジトリ名]としてリポジトリを作成した場合の例です。

こんな感じでclone出来るはず!

おまけ:clone出来ない場合の対処法

ちなみにですが、私は以下のエラーでclone出来ない問題にぶち当たりました…。

どうも「git-upload-packなんて知らん」ということで怒られているようなのです。

git-upload-packコマンドは、クライアント環境でgit fetchしたときにリモート(サーバ環境)側で実行されるコマンドらしいのですが、git-upload-pack.exeはサーバ環境のC:\Program Files\Git\mingw64\binフォルダにちゃんと存在していて、かつ、さっき環境変数に設定してパス通したのになんでかな?という謎エラーでした。パス通したのに効かないなんてこともあるのですね。

対処法としては、clone時にオプションでgit-upload-packのパスを指定することで解決できました。

でもこれ、毎回fetchするときにオプション指定しなくちゃならないのかい…?という疑問もあるかと思いますが、毎回やらなくてもいいように、git configで設定を書き込めます。

ただし、上記設定をした後は、サーバ側でsshdを再起動しましょう。

おわりに

今回はGit for WindowsでGitサーバを立ててみました。手順をまとめると結構簡単に出来ちゃうね?感が出てしまいましたが、構築の道中は細かく色々なことに躓いた気がします。個人的には、日頃GitLab(しかもサーバOSはLinux系)を使用しているのですが、Gitホスティングサービスは構築も簡単だしGUIもあるし、楽なんだなあ~と改めて感じました。

とはいえ、「WindowsにGitサーバを立てたい!」というニーズもあると思いますので、少しでもお役に立てましたら幸いです。

お問い合わせ先

執筆者プロフィール

Yamazaki Naoko
Yamazaki Naokotdi IT技術推進部
社内の開発プロジェクトの技術支援や、新技術の検証に従事しています。主にアプリケーション開発系支援担当で、Java&サーバサイドが得意です。最近は、ブロックチェーンと仲良くなるべく鋭意検証中です。
Pocket

関連記事