Git 伺服器 - Arch Linux 中文维基

跳至內容

# Git 伺服器

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Git server，最近一次同步於 2024-5-17，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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

附註： 需要翻譯。（在 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_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`。

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

有關更詳細的文檔，請訪問以下連結：

- 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 編寫。

  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

分類：​

- 版本控制系統
- 伺服器

隱藏分類：​

- 使用「模板:Translateme」標記的頁面或章節

Git 伺服器
新增話題