Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 尝试使用多存储库和多用户创建git http后端_Linux_Windows_Git_Apache_Git Http Backend - Fatal编程技术网

Linux 尝试使用多存储库和多用户创建git http后端

Linux 尝试使用多存储库和多用户创建git http后端,linux,windows,git,apache,git-http-backend,Linux,Windows,Git,Apache,Git Http Backend,我用git http后端创建了一个git服务器。 我创建了2个存储库(Project1,Project2)和3个用户(user1,user2,user3) 使用命令克隆时: git clone http://myodmain/Project1/ 我只希望user1和user2能够访问此克隆(Project1) 使用命令克隆时: git clone http://myodmain/Project2/ 我只希望user3能够访问此克隆(Project2),而user1和user2无法访

我用git http后端创建了一个git服务器。
我创建了2个存储库(
Project1
Project2
)和3个用户(
user1
user2
user3

使用命令克隆时:

 git clone http://myodmain/Project1/  
我只希望
user1
user2
能够访问此克隆(
Project1

使用命令克隆时:

git clone http://myodmain/Project2/  
我只希望
user3
能够访问此克隆(
Project2
),而
user1
user2
无法访问它

现在,我的配置服务器可以克隆、推、拉、合并,。。。但是所有用户都有相同的权限。

请帮我举几个例子

您尚未提供有关服务器设置的任何信息,因此答案可能会有所不同。我认为您缺少的最重要的部分是在web服务器中设置身份验证。但是,一旦您这样做了,如果您希望对不同存储库的用户分别进行身份验证,那么您将遇到git http后端的问题。我发布了一个涵盖这两个问题的答案。您可能还想查看该帖子以查看其他评论:

以下是我最初在那里发布的内容: 使用Apache 2.4的解决方案

我发现的问题是git http后端脚本实际上控制了对存储库的所有访问。此外,ScriptAlias配置为将所有/git/请求路由到git http后端,而不管路径的其余部分如何。而且,由于您已经为GITGROUP提供了对该脚本的访问权限,该组将可以访问URL中以/git/开头的任何存储库。根据文件

git http后端知道每个存储库的位置,因为Apache为其提供了一个环境变量。我怀疑这意味着git http后端是服务器上唯一直接访问存储库,然后向Apache提供响应的进程

我的解决方案增加了一些额外的步骤。本质上,您将强制任何对git http后端的访问只在您已经对存储库的位置进行了身份验证之后进行,而不是之前。这是通过在存储库目录本身中放置指向脚本的链接,然后验证该位置来完成的

注意:我只使用裸存储库(gitinit--bare)完成了这项工作。我怀疑,如果出于某种原因您需要使用非裸存储库,此解决方案将需要一些调整(最后有一些想法):

简而言之:

  • 在每个存储库中创建到git core的链接(这是我 如果您使用非裸机,您可能会有问题 存储库,请参见下面的想法)
  • 使用ScriptAliasMatch而不是ScriptAlias,以便可以匹配 请求只发送到请求的存储库,并直接发送请求 到符号链接
  • 为每个存储库创建一个指令,并设置 每个站点的GIT_PROJECT_根变量。这是 因为apache不再提供正确的路径 将存储库的
  • 为每个符号链接创建一个指令。唯一目的 对我来说,最重要的是设置目录的选项,比如 -索引。您可以根据需要将其用于其他选项
  • 详细信息:

  • 链接。如果您的存储库是/var/www/html/git/subdir,并且您的git-httpd后端位于/usr/libexec/git-core中,那么该命令将是:
  • ln-s/usr/libexec/git-core/var/www/html/git/subdir/git-core

  • 别名。这将使用一个带有两个反向引用的正则表达式,一个($1)获取存储库的路径,另一个($2)获取命令(git upload pack,等等)。然后,它将其别名为您在第一步中创建的符号链接。在我的正则表达式中,我还确保请求是有效的git请求。它假设对您的站点的请求开始时如下所示https://yoursite/git/some_repo.git:
  • 创建指令。在这里,您可以为git设置存储库的路径,还可以在此处添加身份验证:
  • 
    SetEnv GIT_PROJECT_ROOT/var/www/html/GIT/subdir1.GIT
    SetEnv GIT_HTTP_EXPORT_ALL
    AuthType Basic
    AuthName“需要授权”
    ...  ...
    SetEnv GIT_PROJECT_ROOT/var/www/html/GIT/subdir2.GIT
    SetEnv GIT_HTTP_EXPORT_ALL
    AuthType Basic
    AuthName“需要授权”
    ...  ...
    
  • 创建指令。对于每个存储库,为在步骤a中创建的符号链接创建一个目录:
  • 
    选项+执行CGI-多视图+符号链接SiFownerMatch-索引
    不允许超限
    选项+执行CGI-多视图+符号链接SiFownerMatch-索引
    不允许超限
    
    如果您没有使用裸存储库:

    我只在git服务器上使用裸存储库,但我认为如果没有裸存储库,创建此符号链接可能会出现问题。我担心的是有人会以某种方式将您的链接添加到存储库。我不确定这是否可行,但有几个解决办法:

  • 为每个链接创建一个git ignore,尽管repo用户可能是 能够撤销这个
  • 在服务器之外的其他目录中创建符号链接 存储库目录。我能想到的唯一问题是对的 现在,您可能需要添加第二层身份验证 服从你的指示

  • 您尚未提供有关服务器设置的任何信息,因此答案可能会有所不同。我认为您缺少的最重要的部分是在web服务器中设置身份验证。但是,一旦您这样做了,如果您希望对不同存储库的用户分别进行身份验证,那么您将遇到git http后端的问题。我发布了一个涵盖这两个问题的答案。您可能还想查看该帖子以查看其他评论:

    以下是我最初在那里发布的内容: 使用
    ScriptAliasMatch \
      "(?x)^/git/(.*/)((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))$" \
        "/var/www/html/git/$1/git-core/git-http-backend/$2"
    
    <Location /git/subdir1.git>
        SetEnv GIT_PROJECT_ROOT /var/www/html/git/subdir1.git
        SetEnv GIT_HTTP_EXPORT_ALL
    
        AuthType Basic
        AuthName "Authorization Required"
        ... <the rest of your authentication details here> ...
    </Location>
    
    <Location /git/subdir2.git>
        SetEnv GIT_PROJECT_ROOT /var/www/html/git/subdir2.git
        SetEnv GIT_HTTP_EXPORT_ALL
    
        AuthType Basic
        AuthName "Authorization Required"
        ... <the rest of your authentication details here> ...
    </Location>
    
    <Directory /var/www/html/git/subdir1.git/git-core>
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch -Indexes
        Allowoverride None
    </Directory>
    
    <Directory /var/www/html/git/subdir2.git/git-core>
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch -Indexes
        Allowoverride None
    </Directory>