GIT SVN 与 subgit 和 apache

GIT SVN 与 subgit 和 apache

我已经开始评估一款名为 subgit 的软件,它可以让你无缝地将 repo 与 SVN 或 GIT 连接起来。

在我们的整个组织中,我们使用 apache 连接我们的存储库,而尝试将其与 GIT 结合起来会有些麻烦。

总的来说,我们希望允许不经过身份验证的读取访问,并且写入应该经过身份验证,这在 SVN 上运行良好,但在 GIT 上似乎不那么直接。

除此之外,让 apache 识别它是否是 GIT/SVN 请求并找出将客户端指向何处,以便您可以使用相同的 url,而不管您使用什么 repo 系统。

下面是配置,目前我们对 svn 具有正确的无需身份验证的读访问权限和经过身份验证的写访问权限,但对于 GIT 来说,它是无需身份验证的读/写访问权限。

<VirtualHost *:80>
DocumentRoot /home/subgit/public_html
CustomLog /home/subgit/logs/access_log combined
SetEnv GIT_PROJECT_ROOT /home/subgit/repos/repo/
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER $REDIRECT_REMOTE_USER
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
<LocationMatch "^/git/.*/git-receive-pack$">
  Options +ExecCGI
AuthType Basic
AuthName "subgit"
AuthBasicProvider file
AuthUserFile /home/subgit/etc/subgit
Require valid-user
  Allow From All
</LocationMatch>
<LocationMatch "/svn">
  DAV svn
  SvnPath /home/subgit/repos/repo
AuthType Basic
AuthName "subgit"
AuthBasicProvider file
AuthUserFile /home/subgit/etc/subgit
  AuthzSVNAccessFile /home/subgit/etc/subgit.access
      <LimitExcept GET PROPFIND OPTIONS REPORT>
          Require valid-user
      </LimitExcept>
</LocationMatch>
</VirtualHost>

任何意见都将受到赞赏!

答案1

所以我实际上自己设法解决了这个问题:

<VirtualHost *:80>
DocumentRoot /home/subgit/repos

    <Directory /home/subgit/repos>
        Options       None
        AllowOverride none
        Order         allow,deny
        Allow         from all
    </Directory>

CustomLog /home/subgit/logs/access_log combined
SuexecUserGroup subgit subgit
ScriptAlias /git/ /home/subgit/bin/gitolite-suexec-wrapper.sh/
RewriteEngine On
RewriteCond %{QUERY_STRING} service=git-receive-pack [OR,NC]
RewriteCond %{REQUEST_URI} ^/git/.*/git-receive-pack$ [NC]
RewriteRule .* - [E=AUTHREQUIRED:yes]

 <LocationMatch "/git/">
    Order Allow,Deny
    Deny from env=AUTHREQUIRED
    Allow from all
    Satisfy Any
    AuthType Basic
    AuthName "subgit"
    AuthBasicProvider file
    AuthUserFile /home/subgit/etc/subgit
    Require valid-user
  </LocationMatch>
  <LocationMatch "/svn">
    DAV svn
    SvnPath /home/subgit/repos/testrepo
    AuthType Basic
    AuthName "subgit"
    AuthBasicProvider file
    AuthUserFile /home/subgit/etc/subgit
    AuthzSVNAccessFile /home/subgit/etc/subgit.access
    <LimitExcept GET PROPFIND OPTIONS REPORT>
      Require valid-user
    </LimitExcept>
  </LocationMatch>
</VirtualHost>

就无缝集成的评论而言,它并不完美,但已经相当不错,足以达到目的。

答案2

“SVN 和 git 之间的无缝集成”是不可能的,底层模型差异太大。请查看文档git svn为一个长的git 世界中自然而然的事情列表,但 SVN 无法做到。最好考虑从 SVN 迁移(上述操作git svn可以很好地吸收 SVN 存储库,但这样做速度很慢;可以保留原始文件以进行备份,以便git以后使用)。

相关内容