Git 2.24
— y2sunlight 2020-06-02
本章では、社内用のGitサーバーの構築について説明します。Gitをグループで利用するには、共有リポジトリが必要になります。この時、リモートのGitサーバーとクライアントとの間で使用されるプロトコルは、一般に、Git(ポート番号:9418)、SSH(21)とSmart HTTP(80)/HTTPS(443)が利用できます。これらのプロトコルを使ったGitの運用方法は以下のようになります。
また、Git管理用のツールを利用した運用もあります。
本章では、GitプロトコルとSmart HTTPプロトコルによるのGitサーバー構築について説明します。認証の必要のないLAN環境下では、Gitプロトコルは簡単に設置できます。認証を必要とする場合は、Smart HTTPプロトコルを選んで下さい。また、Smart HTTPを使用したとしても、リポジトリ毎にユーザ権限を設定することができません。これを可能にするには、上記のGit管理用のツールに頼るしかありません。筆者としては、GitoliteをSmart HTTP上で作動させるのが良い方法だと思いますが、それはまたの機会に。ご興味のある方は、Arch Linu のサイトやstackoverflowにその方法が紹介されていますので、そちらをご参照下さい。
サーバー環境
関連記事
リンク
Pro Git 2'nd Edition は、Englishの方が内容が新しい(2020-06-03現在:こちらを推奨)
最終的には、Git Referenceが一番役に立ちます
git2.24 を IUSリポジトリからインストールします。以下にその抜粋を示しますが、詳しくは 本編の IUSによるgit2の導入 をご覧ください。
yum remove git # git1.xの削除 yum install https://repo.ius.io/ius-release-el7.rpm # IUSリポジトリの登録 yum install --enablerepo=ius git224 # git2.24のインストール
Gitサーバー内でも、テスト等などでリポジトリを取得することがあるので、Gitユーザとしての初期設定が必要になります。
git config --global user.name "John Doe" git config --global user.email johndoe@example.com
ここで設定した内容は ~/.gitconfig
に書き込まれます。git config –list
で設定内容が確認できます。
リポジトリを保存するルートのディレクトリ /var/git/
を作成します。
mkdir /var/git/ # ディレクトリを作成し cd /var/git/ # そこに移動する
テスト用の共有リポジトリ sandbox.git
を作成します。成功すると、Initialized empty shared Git repository in …
のメッセージが表示されます。
# 共有リポジトリ sandbox.git を作成します git init --bare --shared ./sandbox.git Initialized empty shared Git repository in /var/git/sandbox.git/ # 作成したリポジトリを確認します ls -l 合計 0 drwxrwsr-x 7 root root 111 6月 3 13:20 sandbox.git
ディレクトリの所有者とグループを apache
にします。
chown -R apache:apache ./sandbox.git
Gitプロトコルは、Gitデーモン(git-daemon)によって提供され、以下のサービスを提供します。
git fetch-pack
と git ls-remote
(デフォルト有効)git archive –remote
(デフォルト無効)git send-pack
(デフォルト無効)
Gitデーモンのデフォルト動作では、upload-pack サービスのみが有効なので、クライアントが利用できるコマンドは git fetch
、 git pull
、git clone
に限られます(即ち、読み取り専用)。この動作は、以下のコマンドで変更する事ができます。LAN内の認証の必要のない場合は、receive-pack を有効にして git push
を有効にすることができます。
# これらのコマンドは、リポジトリディレクトリ(例:/var/git/sandbox.git)の中で実行する必要があります git config daemon.receivepack true # receivepack を有効にする。
本章では、基本的にSmartHTTPによる運用を想定しているので、Gitプロトコルではデフォルト動作通りの「読み取り専用」とします。
git-daemon を IUSリポジトリからインストールします。本章ではgit2.24を使用しているので、パッケージ名は、git224-daemon
です。Gitのインストールについての詳細は本編の IUSによるgit2の導入 をご覧ください。
yum install --enablerepo=ius git224-daemon
インストールの途中で、インストールしても良いか確認される (Is this ok [y/d/N]:
) ので y
と回答します。正常にインストールされると最後に、完了のメッセージが表示されます。
git-daemon は ポート番号 9418
を使用するので FWを設定する必要があります。
firewall-cmd --add-port=9418/tcp --permanent # 恒久的に9418を解放します firewall-cmd --reload # FWのリロード firewall-cmd --list-ports # 解放したポード番号の確認 9418/tcp
尚、Gitプロトコルにはユーザ認証が無いので、使用できるネットワークを制限する場合は、上記の設定を以下のようにします。
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9418" accept' --permanent firewall-cmd --reload # FWのリロード firewall-cmd --list-rich-rules # 設定の確認
Gitデーモンの起動は以下のように行います。
sudo -u apache -g apache git daemon --reuseaddr --export-all --base-path=/var/git/ /var/git/ &
apache
にします。Gitプロトコルだけの運用の場合は、gitユーザを新しく作り、リポジトリの所有者をgitにして、git-daemonもgitで実行して下さい。
–reuseaddr
は起動時に古い接続がタイムアウトするのを待たずにサーバーを再起動します。–export-all
は指定したディレクトリ以下のリポジトリをすべて公開します。特定のリポジトリのみを公開する場合は、そのリポジトリに、git-daemon-export-ok というファイルを作成して下さい。–base-path
はクライアントに要求されたパスに指定したディレクトリ(ここでは /var/git/
)をベースとして付加します。/var/git
)以下のディレクトリを公開します。# 起動の確認 netstat -an | grep 9418 tcp 0 0 0.0.0.0:9418 0.0.0.0:* LISTEN tcp6 0 0 :::9418 :::* LISTEN
Gitプロトコルによる接続URLは以下の通りです:
git://{ホスト名}/{プロジェクト名}.git
{ホスト名}
— ホスト名まはたIPアドレスを指定します{プロジェクト名}.git
— /var/git
以下のディレクトリ名を指定します上の接続URLは本章の設定による場合です。接続URLは設定により異なります。
例:
git clone git://localhost/sandboz.git git clone git://192.168.1.100/sandboz.git
git clone
でGitプロトコルのテストを行います。LAN上の他のホストからも同様に行ってみて下さい。
cd ~ # ホームに移動 git clone git://localhost/sandbox.git # リポジトリの取得 Cloning into 'sandbox'... warning: You appear to have cloned an empty repository.
テストが終了したら、Gitデーモンを停止します。
pgrep -fa git # 停止の確認 pkill git # Gitデーモンの停止
Gitデーモンのサービスを作って、systemctl で操作できるようにします。
以下のように、/etc/systemd/system
下に git-daemon.service
ファイルを作成します。
/etc/systemd/system
[Unit] Description=Start Git Daemon [Service] ExecStart=/usr/bin/git daemon --reuseaddr --export-all --base-path=/var/git/ /var/git/ Restart=always RestartSec=500ms StandardOutput=syslog StandardError=syslog SyslogIdentifier=git-daemon User=apache Group=apache [Install] WantedBy=multi-user.target
Gitデーモンの起動/状態確認/停止は、以下のsystemctlコマンドできます。
systemctl start git-daemon # 起動 systemctl status git-daemon # 状態確認 systemctl stop git-daemon # 停止
また、OSブート時に起動するように、自動起動を有効にしておきます。
systemctl enable git-daemon # 自動起動の有効化 systemctl list-units --type=service|grep git # 有効化の確認
本章では、基本的にSmartHTTPによる運用を想定しています。認証の基本方針は以下の通りです。
SmartHTTP プロトコルは、Git HTTPバックエンド(git-http-backend)によって提供され、以下のサービスを提供します。
git fetch-pack
と git ls-remote
(デフォルト有効)git send-pack
を提供し、クライアントに git push
を許可します。匿名ユーザーの場合はデフォルトで無効になり、Webサーバーで認証されたユーザーの場合はデフォルトで有効になります。【注意】
上の http.receivepack の説明は GitReference によるが、筆者の環境ではBasic認証されている場合でも http.receivepack が有効にならなかった。
HTTPバックエンドのデフォルト動作では、信頼のある特定の内部ネットワークからも git push
が出来ないので、以下のコマンドでこれを有効にします。
# これらのコマンドは、リポジトリディレクトリ(例:/var/git/sandbox.git)の中で実行する必要があります git config http.receivepack true # receivepack を有効にする。
本章の前提条件として CentOS7上で、Apache 2.4 がインストールされているものとします。まだインストールしていない場合は、以下を参考にインストールして下さい。
yum install httpd # Apacheのインストール systemctl enable httpd.service # httpdサービスの自動起動を有効化 systemctl start httpd.service # httpdサービスの開始 firewall-cmd --permanent --add-service=http # FWでhttpサービスの接続を許可 firewall-cmd --reload # FWのリロード
Gitサーバー用のバックエンド /usr/libexec/git-core/git-http-backend
は、gitに同梱されています。
ls -l /usr/libexec/git-core/git-http-backend -rwxr-xr-x 1 root root 1785896 4月 16 06:55 /usr/libexec/git-core/git-http-backend
このバックエンドを起動するために、Apacheに設定ファイル git.conf
を新規に作成します。
/etc/httpd/conf.d
# 環境設定 SetEnv GIT_PROJECT_ROOT /var/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ <LocationMatch "^/git"> <RequireAny> <RequireAny> # LAN内の特定のホストのみ許可 Require all denied Require host localhost Require ip 127.0.0.1 Require ip 192.168.1.0/24 </RequireAny> # Basic認証 AuthType Basic AuthName "Git Access" AuthUserFile /var/git/.htpasswd Require valid-user </RequireAny> # 全開 # Require all granted </LocationMatch>
SetEnv GIT_PROJECT_ROOT
— 環境変数 GIT_PROJECT_ROOT
にリポジトリルート(ここでは /var/git
)を設定しますSetEnv GIT_HTTP_EXPORT_ALL
— 環境変数 GIT_HTTP_EXPORT_ALL
が定義されている場合、指定したディレクトリ(/var/git
)以下のリポジトリをすべて公開します。特定のリポジトリのみを公開する場合は、そのリポジトリに、git-daemon-export-ok
というファイルを作成して下さい。ScriptAlias
— Gitサーバー用のバックエンド git-http-backend
を /git/
にマッピングします /git/
のアクセス制御 — 次のいずれか一方にマッチすればアクセス可能になります
localhost
Or 127.0.0.1
Or 192.168.1.0/24
/var/git/.htpasswd
に格納します編集が終わったら、Apacheを再起動します。
systemctl restart httpd
Basic認証で使用するIDとパスワードを格納したファイル .htpasswd
を作成します。
/var/git/.htpasswd
.htpasswd
は htpasswd
コマンドで作成します。
cd /var/git # 所定のディレクトリ(git.confで指定)に移動 htpasswd -c .htpasswd y2sunlight # ユーザ(y2sunlight)の作成 New password: # パスワードの入力 Re-type new password: # (再入力) Adding password for user y2sunlight
2回目以降はhtpasswd .htpasswd new-user
で-c
オプションは不要です。
.htpasswd
の内容は以下のようになっています。
/var/git
y2sunlight:$apr1$hRCALosz$4qIvpmM4NHzMCEdVH3NAM0
Smart HTTPプロトコルによる接続URLは以下の通りです:
http://{ホスト名}/git/{プロジェクト名}.git
{ホスト名}
— ホスト名まはたIPアドレスを指定します{プロジェクト名}.git
— /var/git
以下のディレクトリ名を指定します上の接続URLは本章の設定による場合です。接続URLは設定により異なります。
例:
git clone http://localhost/git/sandbox.git git clone http//192.168.1.100/git/sandbox.git
git clone
でリポジトリのクローンを作成します。
cd ~ # ホームに移動 git clone http://localhost/git/sandbox.git # リポジトリの取得 Cloning into 'sandbox'... warning: You appear to have cloned an empty repository.
ローカルリポジトリを変更して commit
します。
cd ./sandbox # プロジェクトディレクトリ(sandbox)に移動する echo "Hello,Git." > hello.txt # ファイル(hello.txt)を編集する git add . # ファイルをインデックスに追加する git commit -m "First Commit" # インデックスに追加した変更をリポジトリに記録する
ローカルリポジトリの変更内容をリモートリポジトリに push
します。
git push origin master # ローカルリポジトリの変更内容をリモートリポジトリに送信する
Gitサーバーの運用の運用についてのユースケースをまとめておきます。
新しいプロジェクトを作る
cd /var/git # 共有リポジトリのルートディレクトリに移動する git init --bare --shared ./REPOSITORY.git # 新しい共有リポジトリ(例:REPOSITORY)を作成する chown -R apache:apache ./REPOSITORY.git # ディレクトリの所有者とグループを apache に変更する cd ./REPOSITORY.git # リポジトリのディレクトリに移動する git config http.receivepack true # receivepack(git push) を有効にする
新しいユーザを作る
cd /var/git # 共有リポジトリのルートディレクトリに移動する htpasswd .htpasswd USER # 新しいユーザ(例:USER)を作成する New password: # パスワードの入力 Re-type new password: # (再入力)
Gitを使う
git clone http://192.168.1.100/git/REPOSITORY.git # Smart HTTPによる接続(Read/Write) git clone git://192.168.1.100/REPOSITORY.git # Gitプロトコルによる接続(Read Only)
共有リポジトリを削除する
cd /var/git # 共有リポジトリのルートディレクトリに移動する rm -rf ./REPOSITORY.git # リポジトリのディレクトリを削除する