Git 伺服器
本文概述了如何託管 Git 伺服器。有關更多信息,請參閱 Pro Git 書籍的 Git on the Server 一章。
協議[編輯 | 編輯原始碼]
請參閱Git on the Server - The Protocols,了解詳細說明以及優缺點。
普通(General)[編輯 | 編輯原始碼]
設置 git 伺服器 的分步指南設置 git Server 的分步指南描述了如何在 Arch 上設置不安全的伺服器。
默認情況下,git 用戶已過期("您的帳戶已過期,請聯繫您的系統管理員")。使用 chage 可移除過期條件,舉例如下:
# chage -E -1 git
SSH[編輯 | 編輯原始碼]
您只需要設置一個 SSH 伺服器.
您可以進一步確保 SSH 用戶帳戶的安全,只允許在該用戶帳戶上執行推拉命令。方法是用 git-shell 代替默認登錄 shell。請參閱設置伺服器。
在 Arch 上,使用 #General 中的說明和本節(#SSH)中的說明創建 git 伺服器時,需要採取以下額外步驟:
- 更改主目錄: 為了讓 ssh 能夠讀取
/srv/git/.ssh/authorized_keys
,需要將/etc/passwd
中 git 的主目錄從/
更改為/srv/git
。 - home目錄更改之時更改基本路徑: 如果倉庫是從 git 的主目錄提供服務的,為了讓 git 能夠為倉庫提供服務,需要將
git-daemon\@.service
中的--base-path
改為/srv/git
。
Dumb HTTP[編輯 | 編輯原始碼]
這裡的 "Dump"是指只有 WebDAV 參與了拉取和推送。
nginx[編輯 | 編輯原始碼]
Follow the basic WebDAV instructions for nginx. Pushing via WebDAV also requires Locking. Here is an example location block:
/etc/nginx/nginx.conf
location /repos/ { auth_basic "Authorized Personnel Only!"; auth_basic_user_file /etc/nginx/htpasswd; dav_methods PUT DELETE MKCOL COPY MOVE; dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; dav_access user:rw group:rw all:r; dav_ext_lock zone=general; create_full_put_path on; client_body_temp_path /tmp; }
Note the dav_ext_lock zone
. Add the specified locking zone to the http section of your config:
/etc/nginx/nginx.conf
dav_ext_lock_zone zone=general:10m;
Now do the ususal steps when preparing a git repo for the server:
git clone --bare /path/to/myrepo myrepo.git
- copy the bare repo to the server
- run
git update-server-info
in the bare repo - chown the repo to be owned by http:http
You might have noticed that I added HTTP Basic Authentication to have at lease some means of access control. Everyone who has an password entry in the htaccess file can push.
Now you can clone as usual:
$ git clone https://www.example.com/repos/myrepo.git Cloning into 'myrepo'... $
Make some changes, add, commit, and push:
$ git push origin main error: Cannot access URL https://www.example.com/repos/myrepo.git/, return code 22 fatal: git-http-push failed error: failed to push some refs to 'https://www.example.com/repos/myrepo.git'
Oh noes! For some reason PROPFIND reports 401 Unauthorized and that's all. Nothing in the nginx error logs. Appearently the git client has a problem passing the username and password for all subsequent requests. Running a git credential cache does not help. The only solution that works so far is editing the ~/.netrc (obviously git uses curl for http):
~/.netrc
machine www.example.com login git password topsecret
$ > git push origin main Fetching remote heads... refs/ refs/heads/ refs/tags/ updating 'refs/heads/main' from 03f8860418facfbecedd5e0a81b480131b31bcba to ec5536091e31ebf172a34c6d1ebddfc36e3bd3a6 sending 3 objects done Updating remote server info To https://www.example.com/repos/myrepo.git 0318860..ec55560 main -> main
Don't even think to specify the clone URL as https://username:password@www.example.com/repos/myrepo.git
. This works for the initial clone but for a subsequent push you get an error message in your error log stating that the destination URL is handled by a different repository.
Smart HTTP[編輯 | 編輯原始碼]
The git-http-backend(1) is a CGI program, allowing efficient cloning, pulling and pushing over HTTP(S).
Apache[編輯 | 編輯原始碼]
設置非常簡單,只需安裝Apache HTTP 伺服器,並啟用 mod_cgi
、mod_alias
和 mod_env
,當然還有 git包。
運行基本設置後,在 Apache 配置文件中添加以下內容,該文件通常位於:
/etc/httpd/conf/httpd.conf
<Directory "/usr/lib/git-core"> Require all granted </Directory> SetEnv GIT_PROJECT_ROOT /srv/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
這假設的是:您的 Git 倉庫位於 /srv/git
,並且您希望通過以下方式訪問它們: http(s)://your_address.tld/git/your_repo.git
。
有關更詳細的文檔,請訪問以下連結:
- https://git-scm.com/book/en/v2/Git-on-the-Server-Smart-HTTP
- https://git-scm.com/docs/git-http-backend
Git[編輯 | 編輯原始碼]
The Git protocol is not encrypted or authenticated, and only allows read access.
The Git daemon (git-daemon(1)) can be started with git-daemon.socket
.
The service uses the --export-all
and --base-path
parameters to serve all repositories placed in /srv/git/
.
訪問控制[編輯 | 編輯原始碼]
對於保險(fine-grained)的訪問控制,可採用以下解決方案:
- Gitolite — 一個 Git 訪問控制層,用 Perl 編寫。
- Gitosis — 一個用於託管 Git 倉庫的軟體,用 Python 編寫。
請注意,如果您願意為所有應該訪問版本庫的人創建用戶帳戶,並且不需要 git 對象(如分支)級別的訪問控制,也可以使用標準的文件權限來進行訪問控制。[1]
Web 界面[編輯 | 編輯原始碼]
簡易 web 應用程式[編輯 | 編輯原始碼]
高級 web 應用程式[編輯 | 編輯原始碼]
- Forgejo — 自託管輕量級軟體。Gitea 的社區管理分支。
- Gitea — 無償自託管 Git 服務。它最初是 Gogs 的一個社區管理分支,但在 2022 年由 Gitea Limited 以商業模式擁有。
- GitLab — 用 Ruby 編寫的項目管理和代碼託管應用程式。
- Gogs — 用 Go 編寫的自助託管 Git 服務。
- https://gogs.io || gogsAUR