Git プロトコル v2 の設定

GitLab 12.8で再有効化

Git protocol v2はv1のワイヤプロトコルをいくつかの点で改善し、GitLabではHTTPリクエストに対してデフォルトで有効になっています。SSHを有効にするには、管理者による追加設定が必要です。

新機能や改良点の詳細については、Google Open Source Blogや プロトコルのドキュメントをご覧ください。

前提条件

クライアント側では、git v2.18.0 以降がインストールされている必要があります。

サーバー側では、SSHを設定したい場合、sshd サーバーがGIT_PROTOCOL 環境を受け入れるように設定する必要があります。

GitLab Helm Chartと All-in-one Dockerイメージを使ったインストールでは、SSHサービスはすでにGIT_PROTOCOL 環境を受け入れるように設定されています。ユーザーはこれ以上何もする必要はありません。

Linuxパッケージからのインストールや自分でコンパイルしたインストールでは、/etc/ssh/sshd_config ファイルにこの行を追加して、手動でサーバーのSSH設定を更新してください:

AcceptEnv GIT_PROTOCOL

SSH デーモンの設定が完了したら、変更を有効にするためにデーモンを再起動してください:

# CentOS 6 / RHEL 6
sudo service sshd restart

# All other supported distributions
sudo systemctl restart ssh

手順

新しいプロトコルを使うには、クライアントはGitコマンドに設定-c protocol.version=2 を渡すか、グローバルに設定する必要があります:

git config --global protocol.version 2

HTTP 接続

Git v2がクライアントで使用されていることを確認します:

GIT_TRACE_CURL=1 git -c protocol.version=2 ls-remote https://your-gitlab-instance.com/group/repo.git 2>&1 | grep Git-Protocol

Git-Protocol ヘッダが送信されていることを確認しましょう:

16:29:44.577888 http.c:657              => Send header: Git-Protocol: version=2

Git v2がサーバーで使われていることを確認してください:

GIT_TRACE_PACKET=1 git -c protocol.version=2 ls-remote https://your-gitlab-instance.com/group/repo.git 2>&1 | head

Git プロトコル v2 を使ったレスポンスの例:

$ GIT_TRACE_PACKET=1 git -c protocol.version=2 ls-remote https://your-gitlab-instance.com/group/repo.git 2>&1 | head
10:42:50.574485 pkt-line.c:80           packet:          git< # service=git-upload-pack
10:42:50.574653 pkt-line.c:80           packet:          git< 0000
10:42:50.574673 pkt-line.c:80           packet:          git< version 2
10:42:50.574679 pkt-line.c:80           packet:          git< agent=git/2.18.1
10:42:50.574684 pkt-line.c:80           packet:          git< ls-refs
10:42:50.574688 pkt-line.c:80           packet:          git< fetch=shallow
10:42:50.574693 pkt-line.c:80           packet:          git< server-option
10:42:50.574697 pkt-line.c:80           packet:          git< 0000
10:42:50.574817 pkt-line.c:80           packet:          git< version 2
10:42:50.575308 pkt-line.c:80           packet:          git< agent=git/2.18.1

SSH 接続

Git v2がクライアントで使用されていることを確認します:

GIT_SSH_COMMAND="ssh -v" git -c protocol.version=2 ls-remote ssh://git@your-gitlab-instance.com/group/repo.git 2>&1 | grep GIT_PROTOCOL

GIT_PROTOCOL 環境変数が送信されていることを確認しましょう:

debug1: Sending env GIT_PROTOCOL = version=2

サーバ側では、SSH を使うように URL を変えてHTTP の例と同じものを使うことができます。

Git プロトコルの接続バージョンを見る

本番環境で Git プロトコルのバージョンを確認する方法については、関連ドキュメントを参照ください。