git push 致命失败

git push 致命失败

我不知怎么删除了代码分支的整个目录。我克隆了一个新的。除了推送之外,它运行良好。

~/workspace/wtf (mybranch)]$ git push origin  mybranch 
error: Cannot access URL [my url], return code 22
fatal: git-http-push failed 

但是 git pull 可以工作。我该如何修复它?

答案1

我犯了一个错误,使用 https 而不是 ssh 来获取新副本。从那时起,我进行了修改和提交,但由于显而易见的原因,无法推送。

为了恢复,我简单地将 .git/config 中的 [remote "origin"] 部分从

网址 =https://github.com/AIFDR/riab_core.git

网址 =[电子邮件保护]:AIFDR/riab_core.git

此后,我就可以再次用力了。

答案2

仅使用 git 即可实现更快的 HTTP 推送 - 无需 webDAV

自 git 1.6.6 开始,新增了“smart-http”支持。新方法允许一次性传输整个包,而不是作为单个文件进行传输。

您还可以使用 gitweb 在同一位置提供可浏览的 URL。

注意:由于访问由 apache 控制,因此您可以将任何 Auth 要求(htaccess 或 ldap 等)添加到每个存储库的设置中。

该答案假设您拥有远程服务器并想要添加/修复 http 支持。

首先:检查 apache 日志,当 apache 尝试执行 git-http-backed cgi 脚本时,很可能出现权限被拒绝/无法定位错误。

为 git 添加 HTTP 支持

只需创建一个新的 git_support.conf 文件,并将其包含在 apache 中(在 httpd.conf 中添加包含语句)

#
#  Basic setup for git-http-backend
#

SetEnv GIT_PROJECT_ROOT /opt/git_repos
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER  #IMportant !!! This could be your problem if missing

<Directory /opt/git>  # both http_backend and gitweb should be somewhere under here
        AllowOverride None
        Options +ExecCGI -Includes  #Important! Lets apache execute the script!
        Order allow,deny
        Allow from all
</Directory>

# This pattern matches git operations and passes them to http-backend
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))$" \
        /opt/git/libexec/git-core/git-http-backend/$1

# Anything not matched above goes to displayable gitweb interface
ScriptAlias /git /opt/git/cgi-bin/gitweb.cgi/

结果是具有推/拉的能力:

me@machine /tmp/eddies $ git pull
Already up-to-date.

me@machine /tmp/eddies $ touch changedFile

me@machine /tmp/eddies $ git add .

me@machine /tmp/eddies $ git commit -am"commiting change"
[master ca7f6ed] commiting change
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 changedFile

me@machine /tmp/eddies $ git push origin master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 239 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
To http://mysecretdomain.com/git/eddies
   0f626a9..ca7f6ed  master -> master

您可以在线浏览这些更改。 gitweb 提供了可浏览的界面

来源: http://repo.or.cz/w/alt-git.git?a=blob_plain;f=gitweb/README

答案3

要启用“git push“通过 http,您必须在 Web 服务器上启用 WebDAV。要对 Apache Web 服务器执行此操作,只需编辑配置文件:

vim /etc/httpd/conf/httpd.conf

然后搜索以以下内容开头的行:

<Directory "/var/www/html">

在其后添加以下行:

Dav On

确保 httpd.conf 中的以下行也取消注释:

LoadModule dav_fs_module modules/mod_dav_fs.so

之后您就准备好了。使用以下命令重新启动 Apache Webserver:

service httpd restart

另外,请确保服务器上的所有 git 存储库文件均可由 pache:apache 用户和组写入:

chown -R apache:apache /var/www/html/your_git_repository

否则,如果未能设置正确的权限,则执行“git push”时将导致“PUT 错误:curl result=22,HTTP 代码=403”。

现在只需从您的客户端机器执行“git push”即可一切正常。

答案4

编辑 .git/config 文件的以下部分:

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = http://git.repository.url/repo.git

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = http://username:[email protected]/repo.git

那就尝试一下git push origin master

根据需要编辑配置文件中其他存储库 URL 的身份验证详细信息,并推送到所需的分支。

相关内容