Indefero 是一個 Web 介面 Git 的前端工具,類似 Gitorious。
簡單說,它就是類似 Google Code 那樣的原始碼管理系統。
其實它可以接管 Git、Subversion、Mercurial、Monotone 等 SCM 軟體。
Indefero 是使用 PHP 撰寫的,搭配 Pluf 框架。
*
【Setup Indefero with Git in RHEL 5.x】
[修改 /etc/hosts]
127.0.0.1 indefero
[MySQL 資料庫]
資料庫版本:MySQL 5.x
資料庫帳號:indefero
資料庫密碼:indefero
資料庫名稱:indefero
mysql -u root -p mysql> create database indefero; mysql> ALTER DATABASE indefero CHARACTER SET utf8 COLLATE utf8_general_ci; mysql> grant all privileges on indefero.* to indefero@localhost identified by 'indefero';
[相關使用者]
手動新增的使用者:git
httpd 預設的使用者:apache
[相關路徑]
/home/git/repositories
/home/git/.ssh
/var/www/html/indefero
/var/www/html/pluf
[1]安裝 Pluf 框架
Pluf:http://www.pluf.org
Pluf 需要至少 5.2.4 版本以上的 PHP,RHEL 5.x 附帶的通常都很舊。
RHEL 5.x 需要的 rpm 套件可以去這找:http://rpms.famillecollet.com
先使用 yum 安裝必須的 PHP 套件:
yum install php-pear yum install php-pear-Mail php-pear-Mail-Mime php-pear-mail_mime
下載 Pluf 原始檔到 /var/www/html 并解壓縮,完成。
[2]安裝 Indefero
前往:http://projects.ceondo.com/p/indefero/
下載 Indefero 原始檔到 /var/www/html,解壓縮,然後執行:
cd /var/www/html/indefero cp src/IDF/conf/idf.php-dist src/IDF/conf/idf.php cp src/IDF/conf/path.php-dist src/IDF/conf/path.php
確認 MySQL 資料庫與資料庫使用者。
修改 src/IDF/conf/idf.php:
$cfg['git_repositories'] = '/home/git/repositories/%s.git'; $cfg['git_remote_url'] = 'git://indefero/%s.git'; $cfg['git_write_remote_url'] = 'git@indefero:%s.git'; $cfg['send_emails'] = false; $cfg['mail_backend'] = 'smtp'; $cfg['mail_host'] = 'localhost'; $cfg['mail_port'] = 25; $cfg['url_base'] = 'http://indefero'; $cfg['url_media'] = 'http://indefero/media'; $cfg['url_upload'] = 'http://indefero/media/upload'; $cfg['upload_path'] = '/var/www/html/indefero/www/media/upload'; $cfg['upload_issue_path'] = '/var/www/html/indefero/attachments'; # 超過 40 個字元就可以 $cfg['secret_key'] = 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcd'; # Database configuration $cfg['db_login'] = 'indefero'; $cfg['db_password'] = 'indefero'; $cfg['db_database'] = 'indefero'; $cfg['db_server'] = 'localhost'; $cfg['db_version'] = '5.1'; $cfg['db_table_prefix'] = 'indefero_'; $cfg['db_engine'] = 'MySQL'; # 如果有碰到 open_basedir restriction error, # 執行 cp /etc/mime.types /home,并開啟以下設定: #$cfg['idf_mimetypes_db'] = '/home/mime.types';
修改 src/IDF/conf/path.php:
# 如果沒有特殊修改,使用預設的相對路徑即可。
開始安裝:
cd /var/www/html/indefero/src # 以下命令進行測試安裝 php /var/www/html/pluf/src/migrate.php --conf=IDF/conf/idf.php -a -i -d -u # 以下命令進行實際安裝 php /var/www/html/pluf/src/migrate.php --conf=IDF/conf/idf.php -a -i -d
建立 /var/www/html/indefero/www/bootstrap.php:
require '/var/www/html/indefero/src/IDF/conf/path.php'; require 'Pluf.php'; Pluf::start('/var/www/html/indefero/src/IDF/conf/idf.php'); Pluf_Dispatcher::loadControllers(Pluf::f('idf_views')); $user = new Pluf_User(); $user->first_name = '管理者姓氏'; $user->last_name = '管理者名字'; // Required! 必須! $user->login = '管理者帳號'; // must be lowercase! 全部小寫! $user->email = '管理者信箱'; $user->password = '管理者密碼'; $user->administrator = true; $user->active = true; $user->create(); print "Bootstrap ok\n";
建立管理者:
php /var/www/html/indefero/www/bootstrap.php
順利執行完成後,可以刪除或改名 bootstrap.php 檔。
建立 /etc/httpd/conf.d/indefero:
# 請自行把 [ ] 換成 < > [virtualhost *:80] ServerName indefero DocumentRoot /var/www/html/indefero/www ErrorLog logs/indefero-error_log CustomLog logs/indefero-access_log common [/VirtualHost] [directory /var/www/html/indefero/www] AllowOverride All [/Directory]
在 /var/www/html/indefero/www 內補一個 .htaccess:
Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*) /index.php/$1
重新啟動 Apache:
service httpd restart
連到 http://indefero 登入看看。
[3]設定 Git Repositories
Indefero 原始檔的 doc 資料夾下,有完整的設定說明檔(doc/syncgit.mdtext)。
建立使用者用以控制 Indefero 的 Git Repositories:
useradd git mkdir /home/git/repositories mkdir -p /home/git/.ssh touch /home/git/.ssh/authorized_keys chown -R git.git /home/git chmod 0700 /home/git/.ssh chmod 0600 /home/git/.ssh/authorized_keys
把 httpd 的控制者加到 Git Repositories 控制者的群組:
usermod -a -G git apache
確認系統可以執行 python 程式,因為後面需要執行 scripts/gitserver.py。
python -v
重新修改 src/IDF/conf/idf.php 內的設定:
$cfg['git_repositories'] = '/home/git/repositories/%s.git'; $cfg['git_remote_url'] = 'git://indefero/%s.git'; $cfg['idf_plugin_syncgit_path_gitserve'] = '/var/www/html/indefero/scripts/gitserve.py'; $cfg['idf_plugin_syncgit_path_authorized_keys'] = '/home/git/.ssh/authorized_keys'; $cfg['idf_plugin_syncgit_sync_file'] = '/tmp/SYNC-GIT'; # Remove the git repositories which do not have a corresponding project # This is run at cron time $cfg['idf_plugin_syncgit_remove_orphans'] = false; # git account home dir $cfg['idf_plugin_syncgit_git_home_dir'] = '/home/git'; # where are going to be the git repositories $cfg['idf_plugin_syncgit_base_repositories'] = '/home/git/repositories';
使用 git 的身份加入一下 Cron job:
* * * * * php /var/www/html/indefero/scripts/gitcron.php
安裝 git-daemon:
yum install git-daemon
制作一個 Git Daemon 寫在 /etc/event.d/local-git-daemon:
start on startup
stop on shutdown
exec /usr/bin/git-daemon \
--user=git --group=git \
--verbose \
--reuseaddr \
--base-path=/home/git/repositories/ \
/home/git/repositories/
respawn
啟動:
start local-git-daemon
使用網友寫的 git-daemon,編寫到 /etc/init.d/git-daemon:
(http://projects.ceondo.com/p/indefero/page/git-daemon-sysV-InitScript/)
#!/bin/sh ### BEGIN INIT INFO # Provides: git-daemon # Required-Start: $network $remote_fs $syslog # Required-Stop: $network $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: git-daemon service # Description: git-daemon makes git repositories available via the git # protocol. ### END INIT INFO # Author: Benjamin Graham "bman@duuit.com" # Do NOT "set -e" # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/lib/git-core DESC="git-daemon service" NAME=git-daemon DAEMON=/usr/bin/$NAME PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Fallback options values, we use these when # the /etc/default/git-daemon file does not exist RUN=no USER=git GROUP=git REPOSITORIES="/home/git/repositories/" # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME # If ADVANCED_OPTS is empty, use a default setting if [ "x$ADVANCED_OPTS" == "x" ]; then ADVANCED_OPTS="--base-path=$REPOSITORIES $REPOSITORIES" fi DAEMON_ARGS="--syslog --reuseaddr \ $ADVANCED_OPTS" # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --background --make-pidfile -- $DAEMON_ARGS || return 2 return 0 } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; status) status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? ;; restart|force-reload) # # If the "reload" option is implemented then remove the # 'force-reload' alias # log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 exit 3 ;; esac /etc/default/git-daemon # Defaults for the git-daemon initscript # Set to yes to start git-daemon RUN=yes # Set to the user and group git-daemon should run as USER=git GROUP=git # Set the base path and the directory where the repositories are. REPOSITORIES="/home/git/repositories/" # Provide a way to have custom setup. # # Note, when ADVANCED_OPTS is defined the REPOSITORIES setting is ignored, # so take good care to specify exactly what git-daemon have to do. # # Here is an example from the man page: #ADVANCED_OPTS="--verbose --export-all \ # --interpolated-path=/pub/%IP/%D \ # /pub/192.168.1.200/software \ # /pub/10.10.220.23/software" ADVANCED_OPTS="/usr/lib/git-core/git-daemon \ --verbose --base-path=/home/git/repositories \ /home/git/repositories"
啟動:
chmo a+x /etc/init.d/git-daemon /etc/init.d/git-daemon start service httpd restart
*
【關于 /home/git/repositories】
Git 其實可以 init 一個 bare repository(裸倉儲庫),bare repository 預設允許任何人 push。
實際的 Git 命令是:
cd some_directory && git init --bare
Indefero(大部分相似的系統)正是利用這個 Git 命令幫助使用者建立專案的 Repository。
Indefero 會根據使用者 create project 時給的 project name,
到 /home/git/repositories 內,建立 project_name.git 這種類型的資料夾,
再切換到該資料夾內,使用 git init --bare 初始化這個 Repository。
*
【版本升級】
備份舊的 Pluf 與 Indefero 資料夾:
cp -r pluf pluf_backup cp -r indefero indefero_backup
備份舊的 Indefero 資料庫:
mysqldump -u indefero -p --databases indefero > indefero_backup.sql
下載最新的 Pluf 與 Indefero 原始檔,並解壓縮取代掉原本的資料夾。
然後執行資料庫升級:
cd /home/git/public_html/indefero/src # 測試升級動作 $ php /home/git/public_html/pluf/src/migrate.php --conf=IDF/conf/idf.php -a -d -u # 執行升級動作 $ php /home/git/public_html/pluf/src/migrate.php --conf=IDF/conf/idf.php -a -d
重啟 Apache 檢查:
service httpd restart
*
【錯誤修正】
[idf_plugin_syncgit_base_repositories]
http://projects.ceondo.com/p/indefero/issues/198/
[Getting Write Access to Git Repositories]
http://www.openflow.org/wk/index.php/Git
Reference:
01. http://projects.ceondo.com/p/indefero/page/Installation/
02. http://code.google.com/hosting/
03. https://git.wiki.kernel.org/index.php/InterfacesFrontendsAndTools
04. http://www.pluf.org/doc/install.html
05. http://zx-1986.blogspot.com/2010/08/git-manual.html