使用Apache和mod_macro设置私有多个公共/私有Git存储库

时间:2015-01-04 19:15:13

标签: git apache

我一直在我的私人服务器上运行SVN存储库。我有一些项目需要维护,所有项目都使用标准配置模式进行维护,后者将用作Apache macro。基本上我的结构很简单

映射

  • /家/我的/ srv / SVN /回购
    • / repo1
    • / repo2

有多个宏,因为每个存储库都有自己的身份验证方案(公共读取,经过身份验证的提交或完全私有)

现在我想去Git

即使我找到了一些使用Apache和Git的配置指令,我也没有正确理解它们。以下是我的问题:


我希望我的虚拟主机(https://git.example.com)能够托管多个Git存储库,所有这些都可以从shell轻松配置(例如,添加mod_macro的{​​{1}}指令并运行{{1}通过SSH)。每个人都有自己的许可系统,例如根据{{​​1}}。典型的存储库路径可以Use映射到git init

之类的某个位置

如何在Apache中执行此操作?


到目前为止很糟糕

我尝试构建一个类似下面的Git配置(尚未测试,因为它暂时不会做任何事情)

.htpasswd

但是让我们专注于我现在无法理解的以下几行

https://git.example.com/[projects-or-whatever]/myProject.git

从我的understanding上面的正则表达式匹配绝对路径,如

/home/me/srv/git/repos/myProject

好的,看起来我的所有项目都会放在<VirtualHost *:443> ServerName git.example.com ServerAlias www.git.example.com ServerAdmin me@example.com AssignUserID me myself # Use HTTP Strict Transport Security to force client to use secure connections only Header always set Strict-Transport-Security "max-age=500000000" ErrorLog /path/to/error_log CustomLog /path/to/access_log "vhost_combined" DocumentRoot /srv/www/default SSLEngine on SSLOptions +StrictRequire #SSLPassPhraseDialog builtin SSLCertificateFile /path/to.crt SSLCertificateKeyFile /path/to.key SSLCertificateChainFile /path/to.ca-bundle SSLVerifyClient none SSLProxyEngine on #Used for system login instead of .htaccess AddExternalAuth pwauth /usr/bin/pwauth SetExternalAuthMethod pwauth pipe <IfModule mime.c> AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl </IfModule> 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))$" \ "/usr/lib/git/git-http-backend/$1" ScriptAlias /git /usr/share/gitweb/gitweb.cgi SetEnv GIT_PROJECT_ROOT /home/me/srv/git/repos/ SetEnv GIT_HTTP_EXPORT_ALL #In this directory, specific repositories are configured Include "/home/hosting/vhosts.d/me/git/*.git.conf" <Directory "/home/me/srv/git/repos"> Allow from all Options +ExecCGI AllowOverride All </Directory> <Directory "/usr/lib/git/"> Options ExecCGI Indexes Order allow,deny Allow from all </Directory> AddHandler cgi-script cgi DirectoryIndex gitweb.cgi <Files gitweb.cgi> SetHandler cgi-script </Files> </VirtualHost> 下,如果我不改变它,是正确的吗?

但是,由于我目前不知道Git over HTTP协议是如何工作的,如何独立于其他存储库保护每个存储库

1 个答案:

答案 0 :(得分:0)

挖掘the book可能会提供答案。在我尝试之前,这是候选答案。

基本上,上面的全局配置告诉所有以给定模式结尾的内容(例如git-receive-pack)都会被发送到Git CGI。行。

但使用正确的LocationMatchAlias<Directory>指令应该有效。这是草稿:

  • 使用Alias将文件系统目录映射到某个位置
  • 如果需要,使用<Directory>设置.htaccess。 SVN使用HTTP verbs来区分读/写操作,Git使用git-receive-pack进行写操作。该书建议使用LocationMatch指令
  • 将所有内容包裹在Macro