如何通过 http 设置 git?

Posted

技术标签:

【中文标题】如何通过 http 设置 git?【英文标题】:How to set up git over http? 【发布时间】:2014-12-31 07:56:06 【问题描述】:

我需要用 git-over-http(智能 http)搭建一个 git 服务器,但是网上可用的资源很乱,混入了其他 apache 配置,缺少细节或者不够明确。

我根据我发现可用资源中的不足来回答这个问题。

【问题讨论】:

【参考方案1】:

首先有必要了解 git-over-http 有 2 个组件:git 和 apache。这两者是通过一个名为 git-http-backend 的脚本连接起来的。挑战在于配置这两个组件之间的接口,让对git的http请求由apache转发。

注意:安全性超出了本指南的范围。

    首先使用发行版的包管理器安装 git 和 apache2。

    添加 apache 启用 git-over-http 所需的模块。这些是 cgi、别名和 env

$ a2enmod cgi alias env
    将以下内容复制到/etc/apache2/httpd.conf(不删除其中包含的任何其他内容)
<VirtualHost *:80>
    SetEnv GIT_PROJECT_ROOT /data/git
    SetEnv GIT_HTTP_EXPORT_ALL
    SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
    ScriptAliasMatch \
        "(?x)^/(.*/(HEAD | \
        info/refs | \
        objects/(info/[^/]+ | \
        [0-9a-f]2/[0-9a-f]38 | \
        pack/pack-[0-9a-f]40\.(pack|idx)) | \
        git-(upload|receive)-pack))$" \
        "/usr/lib/git/git-http-backend/$1"
    Alias /git /data/git
    <Directory /usr/lib/git>
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
    现在将出现的 2 次 /data/git 替换为服务器上 git 存储库的父目录(如果您还没有任何存储库,请不要担心,只需使用您打算放置它/它们的目录即可)

还将/usr/lib/git/git-http-backend 替换为您系统上的git-http-backend 位置,可以使用$ find / -name git-http-backend 找到

可能是您系统上的REDIRECT_REMOTE_USER 实际上覆盖了有效的REMOTE_USER。如果完成后此设置不起作用,请尝试删除该行。

根据this 来源,可能需要将目录标记中的最后两行替换为Require all granted 对于 apache 2.4 及更高版本。

    重启apache服务器:$ apache2ctl -k graceful

现在 apache 服务器已设置完毕,但我们还没有完成,设置 repos 的一些重要部分会影响此设置是否有效。

    设置存储库:
$ mkdir myrepo.git
$ cd myrepo.git
$ git init --bare --shared
$ cp hooks/post-update.sample hooks/post-update
$ git update-server-info
$ chown -R wwwrun:www

这里重要的是要了解最后一行将 repo 的所有者更改为 apache2 用户。此用户在您的系统上可能不同。要查找 apache 用户,请执行 $ ps aux | egrep '(apache|httpd)'。然后要找到用户的组名,执行$ id user-name。在我的系统上,用户是 wwwrun 和组 www。相应地替换。

    使用回购

为了使用 repo,您​​需要知道 url。对于此设置,网址为 http://server.domain/myrepo.git

注意:https 不起作用。

从客户端访问 repo 时,只需将其添加为远程:

$ git remote add origin http://server.domain/myrepo.git

然后你可以像任何其他 git repo 一样与它交互。

【讨论】:

非常感谢!它在我的 ubuntu 14.04 和 apache 2.4.7 中为我工作!一些细节,我的 apache 用户是 www-data,在步骤 6 a '.'最后缺少命令“chown ...”。 git位于我的ubuntu文件夹'/usr/lib/git-core' 我试过同样的事情,但似乎有些权限问题。我尝试克隆时收到 403(无法访问) 效果很好,只是它不提示进行任何身份验证。您是否只是在 Apache 中为此设置了基本身份验证? 我很久以前就这样做了,最后得到了一个付费解决方案,所以我无法回答你的问题。希望你能解决 如果您在 CentOS 中执行此操作并且似乎无法取得任何进展 - 请仔细检查您的 iptables 规则。 CentOS 默认锁定所有内容。此外,如果您遵循 Git 文档,您可能需要修改 .htpasswd 文件的 SELinux 设置。【参考方案2】:

访问权限不同的多个项目

有gitolite,但复杂... 一个简单的解决方案是在 apache2 conf 中创建宏:

## Git root

SetEnv GIT_PROJECT_ROOT /opt/gitroot
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
SetEnv GITWEB_CONFIG /etc/gitweb.conf

##  SMART Http

ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/

<Directory "/usr/libexec/git-core*">
   Options +ExecCGI +Indexes
   Order allow,deny
   Allow from all
   Require all granted
</Directory>

<Macro Project $repository $developers $users>
    <LocationMatch "^/git/$repository.*$">
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile /opt/basic_auth
        Require $developers $users 
    </LocationMatch>
    <LocationMatch "^/git/$repository/git-receive-pack$">
        AuthType Basic
        AuthName "Git Access"
        AuthUserFile /opt/basic_auth
        Require  $developers
    </LocationMatch>
 </Macro>

 IncludeOptional /opt/git_access.conf

在 /opt/git_access.conf 中

Use Project test1 "admin john" "mike"
Use Project test2 "admin emma" "all granted"

因此,git 项目 test1 将具有 admin 和 john 的读/写访问权限,而 mike 具有只读访问权限。

项目 test2 将拥有所有经过身份验证的用户的读取权限。

git_access.conf 可以由您的工具从您的项目和用户的数据库中生成,例如,并通过“服务 httpd reload”重新加载。

对于 gitweb 读取访问的相同配置,添加 /etc/gitweb.conf :

$export_auth_hook = sub 
        my $repo = shift;
        my $user = $cgi->remote_user;
        if($repo =~ s/\/opt\/gitroot\///) 
           open FILE, '/opt/git_access'; 
           while(<FILE>) 
               if ($_ =~ m/Use Project $repo \"(.*)\" \"(.*)\"/)
                
                    my $users = $1 . ' ' . $2;
                    $users =~ s/all granted/$user/;
                    $users =~ s/user//;
                    if ( $users =~ m/$user/ ) 
                        return 1;
                    
                              
            
        
        return 0;
;

这个 gitweb 小钩子隐藏(返回 0)当前用户没有读取权限的 git 存储库。

并进入apache2配置,经典的gitweb conf:

## Gitweb  

Alias /gitweb /var/www/git

<Directory /var/www/git>
    AddHandler cgi-script .cgi
    DirectoryIndex gitweb.cgi
    Options +ExecCGI +Indexes +FollowSymlinks 
    AllowOverride None    
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /opt/basic_auth
    Require valid-user
</Directory>

这是我的配置。

【讨论】:

太棒了,非常感谢你。一件事,您需要用户... Require $developer $user Require $developer 只是缺少 user 字。 Require user $developer $user 或者我猜 user 词也可以添加到 git_access.conf 中,这样你就可以使用 Require allgranted still。

以上是关于如何通过 http 设置 git?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 Git 通过其 ssh 连接使用 socks 代理?

如何让 git 通过代理和 IntelliJ Idea 工作?

如何通过设置环境变量的 Windows 终端启动 Git Bash?

如何暂时禁用 git http 代理

如何设置Git提交注释

如何配置系统通过 ssh 反向隧道/代理使用 git?