gitolite3
とGitWeb
を使用して,プライベートなレポジトリを構築する方法を紹介します.gitolite3
を使用することで,git-daemon
を使用するよりもはるかに簡単にアクセス制限を実施することが可能です.
特徴は下記のとおりです.なお,想定環境はUbuntu 16.04 LTS Xenial Xerusです.
-
git clone git@github.com:kyokuheki/***.git
みたいな形でclone
できます.githubと同じ形式です. -
22/tcp
とhttp/80
を使用し,git-daemon
で使用される9418/tcp
は使用しません. - アクセス制限は,テキストベースで記述できます.
- アクセス制限のコンフィグファイルは
git
で管理されます. - ユーザは公開鍵によって管理されます.
-
gitolite3
だけの導入であれば,Apache
は使用しません.
gitolite3のインストール
管理者用の鍵の作成
gitolite3の管理者となるユーザがgitolite用の鍵を作成し,作成した鍵の公開鍵をサーバの作業ユーザのディレクトリにコピーしておく.
下記は管理者端末から実施する.
$ ssh-keygen
$ ssh-copy-id ubuntu@<gitサーバ>
$ ssh ubuntu@<gitサーバ>
$ ssh ubuntu@<gitサーバ> "ls .ssh"
authorized_keys
$ ssh ubuntu@<gitサーバ> "cat .ssh/authorized_keys"
ecdsa-sha2-nistp521 *****************************== <####>@<####>
パッケージのインストール
次に,gitサーバにログインして下記コマンドを実行.
インストール時にgitolite3の管理者の公開鍵を聞かれるので,/home/<user>/.ssh/authorized_keys
と入力する.gitolite3ユーザが作成される.
$ sudo apt install git gitolite3
$ sudo grep gitolite3 /etc/passwd
gitolite3:x:104:112:git repository hosting,,,:/var/lib/gitolite3:/bin/bash
$ sudo ls -a /var/lib/gitolite3
. .bash_history .gitolite .ssh projects.list
.. .cache .gitolite.rc logs repositories
.gitolite.rc
に設定を追加
下記の操作でgitoliteからgitwebのdescriptionを設定できるようになる.
sudo vim /var/lib/gitolite3/.gitolite.rc
GIT_CONFIG_KEYS => 'gitweb\.(owner|description|category)',
アクセス権・レポジトリの設定・追加
管理者端末から下記コマンドを実行して,管理者端末にgitolite管理用のデータをクローンする.
git clone gitolite3@<gitサーバ>:gitolite-admin.git
ユーザの追加
公開鍵を追加すれば,ユーザが追加される.ユーザ名は公開鍵のファイル名.
cp ~/.ssh/id_rsa.pub ./gitolite-admin/keydir/<username>.pub
レポジトリのアクセス権の設定
conf/gitolite.conf
にrepo
を追加してpush
すると,レポジトリが追加される.
vim ./gitolite-admin/conf/gitolite.conf
git commit -m "edit config"
git push
@developers = admin user1 user2 user3
@admin = admin user1
repo gitolite-admin
RW+ = admin @admin
R = @developers
repo testing
RW+ = @developers
R = gitweb @all
repo sandbox
desc = "git sandbox"
RW+ = @developers
R = gitweb @all
repo soft-patch-panel
R = gitweb @all
動作確認
$ ssh gitolite3@<gitサーバ> info
hello admin, this is gitolite3@gitserver running gitolite3 3.6.4-1 (Debian) on git 2.7.4
R W gitolite-admin
R W sandbox
R W testing
$ ssh gitolite3@<gitサーバ> help
hello okuda, this is gitolite3@gitserver running gitolite3 3.6.4-1 (Debian) on git 2.7.4
list of remote commands available:
desc
help
info
perms
writable
参考
- http://d.hatena.ne.jp/Dltn/20121114/1352905191
- http://qiita.com/mountcedar/items/9d87d793a493295e08f0
- https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-Gitolite
- http://gitolite.com/gitolite/http.html
gitweb
gitサーバ上で下記コマンドを実行する.
sudo apt install gitweb libcgi-pm-perl
sudo a2enconf gitweb
sudo a2enmod cgid
sudo service apache2 restart
以上で完了.
Ubuntu 14.04の場合
ちなみにUbuntu 14.04の場合はもう少し作業が必要.gitwebによって追加されるApache2の設定ファイルはパスや内容が間違っているので修正する.
sudo apt install gitweb
sudo mv /etc/apache2/conf.d/gitweb /etc/apache2/sites-available/gitweb.conf
sudo vim /etc/apache2/sites-available/gitweb.conf
Alias /gitweb /usr/share/gitweb
<Directory /usr/share/gitweb>
Options +FollowSymLinks +ExecCGI
AddHandler cgi-script .cgi
</Directory>
gitwebを有効化して,apache2を再起動する.
sudo a2enmod cgid
sudo a2ensite gitweb.conf
sudo service apache2 restart
gitolite3とgitwebの連携
次にgitolite3にgitwebからアクセスできるように設定を追加する.gitwebはapache2のプロセス配下で動作するので,ユーザidはwww-data
となる.www-data
が属するグループからアクセスできるようにしておけば問題なく動作する.
UMASKの設定
gitolite3によるファイル操作時のUMASKを設定し,グループのパーミッションが追加されるようにする.
sudo vim /var/lib/gitolite3/.gitolite.rc
UMASK => 0027,
既存ファイルのアクセス権を修正
sudo gpasswd -a www-data gitolite3
sudo chmod g+rx /var/lib/gitolite3
sudo chmod g+r /var/lib/gitolite3/projects.list
sudo chmod -R g+r /var/lib/gitolite3/repositories
sudo find /var/lib/gitolite3/repositories -type d -exec chmod g+x {} +
gitweb.confの修正
gitwebの設定を修正し,gitolite3を参照するように変更する.
vim /etc/gitweb.conf
# cat /etc/gitweb.conf
# path to git projects (<project>.git)
$projectroot = "/var/lib/gitolite3/repositories";
# directory to use for temp files
$git_temp = "/tmp";
# target of the home link on top of all pages
# $home_link = $my_uri || "/";
# html text to include at home page
# $home_text = "indextext.html";
# file with project list; by default, simply scan the projectroot dir.
$projects_list = "/var/lib/gitolite3/projects.list";
$strict_export = "true";
# stylesheet to use
@stylesheets = ("static/gitweb.css");
# javascript code for gitweb
$javascript = "static/gitweb.js";
# logo to use
$logo = "static/git-logo.png";
# the 'favicon'
$favicon = "static/git-favicon.png";
# git-diff-tree(1) options to use for generated patches
# @diff_opts = ("-M");
@diff_opts = ();
参考
- http://troglobit.github.io/blog/2015/06/30/howto-apache-with-gitweb-on-debian-8-dot-1/
- http://gitolite.com/gitolite/gitweb-daemon.html
- https://www.hellion.org.uk/blog/posts/gitolite-and-gitweb-vhost-setup/
リモートレポジトリのミラー
githubにある公開レポジトリをリモートレポジトリにミラーしていつでもアクセスできるようにする.
sudo su gitolite3
cd ~/repositories
git clone --mirror https://github.com/garogers01/soft-patch-panel.git
cd soft-patch-panel.git
git fetch --all
exit
sudo service apache2 restart
Smart HTTPでHTTPでCloneできるようにする
apache2が既に入っている環境であれば,ちょっとの設定追記でSmart HTTPを有効化できます.
vim /etc/apache2/sites-available/git.conf
a2ensite git.conf
apache2ctl configtest
service apache2 restart
SetEnv GIT_PROJECT_ROOT /var/lib/gitolite3/repositories
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git /usr/lib/git-core/git-http-backend
<Location /git>
Options +ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch
AuthType Basic
AuthName "Smart HTTP Git Access"
AuthUserFile "/var/www/trac/.htpasswd"
Require valid-user
Order allow,deny
Allow from all
</Location>
ErrorLog ${APACHE_LOG_DIR}/error_git.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
# LogLevel debug
CustomLog ${APACHE_LOG_DIR}/access_git.log combined
参考
- http://gitolite.com/gitolite/install.html
- http://sharadchhetri.com/2013/05/31/how-to-create-own-git-server-with-gitolite-and-gitweb-in-ubuntu/
- http://absolutearea.blogspot.jp/2014_08_01_archive.html
- https://www.atlassian.com/ja/git/tutorial/git-basics#!init
- http://shim0mura.hatenadiary.jp/entry/20120914/1347591103