Git 伺服器

出自 Arch Linux 中文维基

本文或本節需要翻譯。要貢獻翻譯,請訪問簡體中文翻譯團隊

附註: 需要翻譯。(在 Talk: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 伺服器時,需要採取以下額外步驟:

  1. 更改主目錄: 為了讓 ssh 能夠讀取 /srv/git/.ssh/authorized_keys,需要將 /etc/passwd 中 git 的主目錄從/更改為 /srv/git
  2. 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[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

原因: There are many web servers with CGI support. (在 Talk:Git 伺服器 中討論)

The git-http-backend(1) is a CGI program, allowing efficient cloning, pulling and pushing over HTTP(S).

Apache[編輯 | 編輯原始碼]

設置非常簡單,只需安裝Apache HTTP 伺服器,並啟用 mod_cgimod_aliasmod_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

注意: 確保 Apache 可以讀寫您的版本庫。

有關更詳細的文檔,請訪問以下連結:

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 編寫。
https://github.com/sitaramc/gitolite || gitolite
  • Gitosis — 一個用於託管 Git 倉庫的軟體,用 Python 編寫。
https://github.com/tv42/gitosis || gitosis-gitAUR

請注意,如果您願意為所有應該訪問版本庫的人創建用戶帳戶,並且不需要 git 對象(如分支)級別的訪問控制,也可以使用標準的文件權限來進行訪問控制。[1]

Web 界面[編輯 | 編輯原始碼]

簡易 web 應用程式[編輯 | 編輯原始碼]

  • Gitweb — Git 自帶的默認 Web 界面
  • cgit — 一個用純 C 語言編寫的 git 網頁界面。
https://git.zx2c4.com/cgit/ || cgit

高級 web 應用程式[編輯 | 編輯原始碼]

  • Forgejo — 自託管輕量級軟體。Gitea 的社區管理分支。
https://forgejo.org || forgejo
  • Gitea — 無償自託管 Git 服務。它最初是 Gogs 的一個社區管理分支,但在 2022 年由 Gitea Limited 以商業模式擁有。
https://gitea.io || gitea
  • GitLab — 用 Ruby 編寫的項目管理和代碼託管應用程式。
https://gitlab.com/gitlab-org/gitlab-ce || gitlab
  • Gogs — 用 Go 編寫的自助託管 Git 服務。
https://gogs.io || gogsAUR