Installation

使 VirtualMin git 模組 SMART

  • November 24, 2014

我使用 VirtualMin 的 git 模組在我的一台伺服器上通過 http 設置了一個私有 git。我有其他使用 git over ssh 的伺服器,但這是我第一次嘗試通過 http 和 VirtualMin 設置它。

不幸的是,在過去的幾個小時裡,我發現預設的 VirtualMin 模組不使用智能 http 模式,而是在 DAV 上中繼以將送出推送到伺服器。我真的不喜歡。

此外,我嘗試將我的舊儲存庫移至此伺服器,但我無法使用它們,因為沒有 /info/ref 文件。(我也聽說使用智能http模式我不需要這個文件)

結果,我試圖找到一個關於安裝smart git http的文件,發現了很多。但我認為它們中的任何一個都不兼容 VirtualMin 或其預設的 git 模組,

你們有誰知道我需要如何自定義我的 git 的安裝和 Apache 設置以使用智能 http 協議而對 VirtualMin 的傷害很小並且仍然與 VirtualMin 兼容?

我真的不希望在 VirtualMin 更新或此控制面板通常執行的設置重新創建過程之後刪除我的設置和配置。

請與我分享您對此事的看法。謝謝

作業系統:CentOs 6.5 x64

取自在 Virtualmin 上為 Git 設置 Smart HTTP


這裡開始,解決方案是使用 git-http-backend 執行檔從普通 HTTP 切換到智能 HTTP,該執行檔可以執行所有鉤子,而且據說速度也更快。

  1. 將 git-httpd-backend 執行檔複製到 /home/domain/cgi-bin/ 目錄,並將權限設置為 domain:domain。這是為了避免 suexec 問題。
$ cp /usr/libexec/git-core/git-http-backend /home/domain/cgi-bin
$ chown domain:domain /home/domain/cgi-bin/git-http-backend
  1. 在 上/etc/httpd/conf/httpd.conf,將此添加到域的 VirtualHost:
[...]
ServerName domain.com

[...]

# Set the root directory where git repositories reside
SetEnv GIT_PROJECT_ROOT /home/domain/public_html/git

# By default, the git-http-backend allows push for authenticated
# users and this directive tells the backend when a user is authenticated.
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER

# Export all repositories
SetEnv GIT_HTTP_EXPORT_ALL

ScriptAlias /dev/ /home/domain/cgi-bin/git-http-backend/

[...]

# Add this if it’s not already there

DAV on
AuthType Basic
AuthName domain.com
AuthUserFile /home/domain/etc/git.basic.passwd
Require valid-user
Satisfy All

RedirectMatch ^/git(/+)$ /git/gitweb.cgi
RewriteEngine off
AddHandler cgi-script .cgi

[...]
  1. 然後重啟apache。現在所有的 repos 都可以在 上獲得http://gituser@domain.com/dev/git/*,例如,http://gituser@domain.com/dev/git/reponame.git所有的鉤子都將按預期執行。

展望未來,當您通過 Virtualmin 創建新儲存庫時,您需要執行以下手動步驟:

  1. 創建一個空文件/home/domain/public_html/git/reponame.git/git-daemon-export-ok
  2. 創建它/home/domain/public_html/git/reponame.git/hooks/post-receive並使其所有人都可以執行,並歸 apache:domain 所有:
#!/bin/sh
#
# An example hook script for the "post-receive" event.
#
# The "post-receive" script is run after receive-pack has accepted a pack
# and the repository has been updated. It is passed arguments in through
# stdin in the form
#
# For example:
# aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master
#
# see contrib/hooks/ for a sample, or uncomment the next line and
# rename the file to "post-receive".

# Echo to the client that you’re sending the mail now
echo "Sending notification email..."
. /usr/share/git-core/contrib/hooks/post-receive-email

# Make sure to update the git repo info on the server for pulls by other clients
git update-server-info
echo "Updated server info."
  1. 根據此連結,設置 git 目錄的權限如下,以避免在送出中推送新文件時出現寫權限問題(同時確保 gitweb.cgi 腳本只能由所有者寫入以避免 suexec 錯誤出現在 /etc/httpd/logs/suexec.log 中):
$ cd /home/domain/public_html/git/
$ chmod -R g+ws *
$ chgrp -R domain *
$ chmod -R g-w gitweb.cgi
$ chmod -R g-s gitweb.cgi
  1. 更新/home/domain/public_html/git/reponame.git/config以匹配以下內容:
[core]
   repositoryformatversion = 0
   filemode = true
   bare = true
[hooks]
  mailinglist = email1@domain.com, email2@domain.com
  envelopesender = git-commits@domain.com
  emailprefix = "[REPONAME] "

引用自:https://serverfault.com/questions/597091