通过HTTPS git-receive-pack共享的GIT失败

时间:2016-05-28 23:28:16

标签: git ubuntu-14.04

我正在尝试配置我自己的私有git服务器以使其可通过HTTP使用,但我被困住了,我需要一些帮助。

我回顾了几个关于如何通过HTTP提供git存储库的教程,我认为几乎所有部分都在正确的位置,因为目前我能够从不同工作站上的几个客户端克隆远程存储库,我也可以浏览使用gitweb应用程序的存储库。

从客户端我可以运行git commit命令,但我无法将更改推送到主分支。

git push comman记录以下错误:

remote: error: unable to create temporary file: Operation not permitted
remote: fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit

更新:经过多次测试后,我成功地从几个运行的客户端推了四次。成功推送只是重复执行相同命令几次。这让我相信问题可能是服务器端的一些超载问题,不允许接收更改,但我仍然无法理解缺少哪个配置。

环境如下:

$ uname -av
Linux odroid 3.8.13.30 #1 SMP PREEMPT Fri Feb 20 14:34:08 BRST 2015 armv7l armv7l armv7l GNU/Linux

$ apache2 -version
Server version: Apache/2.4.7 (Ubuntu)
Server built:   Jan 14 2016 17:49:32

$ git --version
git version 1.9.1

权限不应该是一个问题,因为存储库文件夹对运行apache服务的组具有rw权限

$ ls /var/git/repos
drwxrwx--- 0 odroid www-data 0 may 28 23:15 testremote.git
drwxrwx--- 0 odroid www-data 0 may 28 23:17 test

$ ps aux | grep apache
root      4524  0.0  0.8 107588 17836 ?        Ss   may25   0:17 /usr/sbin/apache2 -k restart
www-data  7797  0.0  0.4 107836  8372 ?        S    00:35   0:00 /usr/sbin/apache2 -k restart
www-data  7798  0.0  0.3 107636  7392 ?        S    00:35   0:00 /usr/sbin/apache2 -k restart
www-data  7799  0.0  0.4 107836  8300 ?        S    00:35   0:00 /usr/sbin/apache2 -k restart
www-data  7800  0.0  0.3 107692  7916 ?        S    00:35   0:00 /usr/sbin/apache2 -k restart
www-data  7801  0.0  0.3 107636  7392 ?        S    00:35   0:00 /usr/sbin/apache2 -k restart
www-data  7812  0.0  0.3 107636  7404 ?        S    00:35   0:00 /usr/sbin/apache2 -k restart

我当前的apache配置是:

            SetEnv GIT_PROJECT_ROOT /mnt/wh13/sandbox/git/repo/
            SetEnv GIT_HTTP_EXPORT_ALL 1
            SetEnv REMOTE_USER $REDIRECT_REMOTE_USER
            ScriptAliasMatch "(?x)^/git/\
                     (.*\.git/(HEAD|info/refs|objects/\
                     (info/[^/]+|[0-9a-f]{40}\.(pack|idx))|git-(upload|receive)-pack))$"\
                      /usr/lib/git-core/git-http-backend/$1

            ScriptAlias /git/ /usr/share/gitweb/
            ScriptLog ${APACHE_LOG_DIR}/cgi_log.log
            <Directory /usr/share/gitweb>
               Options +FollowSymLinks +ExecCGI
               AddHandler cgi-script .cgi
               DirectoryIndex gitweb.cgi
            </Directory>
            <Directory "/usr/lib/git-core*">
               Options ExecCGI Indexes
               AuthType Basic
               AuthName "GIT Repositories"
               AuthUserFile /mnt/wh13/sandbox/git/htpasswd.git
               Require valid-user
               Order allow,deny
               Allow from all
            </Directory>
            <Directory "/usr/share/gitweb/static">
               Options -ExecCGI +Indexes
               SetHandler default-handler
            </Directory>

我不了解哪个操作不被允许,并且尝试使用ScriptLog ${APACHE_LOG_DIR}/cgi_log.log指令从CGI脚本获取更多详细信息并未提供任何有用的信息。

有人可以就如何进一步排除故障并解决问题提出一些建议吗?

提前致谢并对长篇文章感到抱歉

1 个答案:

答案 0 :(得分:0)

遇到这些错误时,Git 2.21(2019年第一季度)可能会更强大。

http后端CGI进程没有正确清理它自身死亡时运行的子进程以运行upload-pack等,此问题已得到纠正。

请参见commit 02818a9Max Kirillov (max630)(2018年11月24日)。
帮助者:Carlo Arenas (carlosJoseloMtz)
(由Junio C Hamano -- gitster --commit ea8620b中合并,2019年1月4日)

  

http-backend:启用对upload

上分叉的receive-pack / exit的清理      

如果http-backend因错误而去世,则开始的upload-packreceive-pack 不会被杀死并等待,而是要运行一段时间,直到由于关闭stdin而退出< / strong>。

     

这在工作环境中可能是不可取的,并且有时会导致t5562失败,因为进程会保持打开状态act.err,有时在下一次使用该文件的测试之后就在那里写入错误。

     

通过启用http-backend出口处的命令清除功能来修复。