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