falha fatal do push do git

24

De alguma forma, apaguei o diretório inteiro da minha ramificação de código. Eu clonei um novo. Funcionou bem, exceto empurrando.

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

o git pull funciona, no entanto. Como posso corrigir isso?


fonte
1
Por favor, leia este manual aqui e observe o ponto http.receivepack.
hhh 12/06

Respostas:

33

Cometi o erro de usar https em vez de ssh para uma nova cópia. Desde então, fiz modificações e confirmações, mas não pude pressionar por razões óbvias.

Para recuperar, mudei a seção [remote "origin"] em .git / config de

url = https://github.com/AIFDR/riab_core.git

para

url = [email protected]: AIFDR / riab_core.git

Depois disso, eu poderia empurrar novamente.


fonte
2
Não há necessidade de mudar para outro protocolo, leia minha resposta abaixo se você deseja enviar o http.
Basil A
1
Concordo com Basil, isso é desnecessário e impossível em alguns ambientes corporativos que têm acesso limitado através de firewalls, etc.
... o problema é que git-http-push failed, vejo que o op está tentando configurar as coisas por http ou https, -1.
hhh
14

HTTP Push mais rápido com apenas git - webDAV não é necessário

O novo suporte "smart-http" desde o git 1.6.6. O novo método permite que o pacote inteiro seja transmitido de uma só vez, e não como arquivos individuais.

Você também pode usar o gitweb para fornecer URLs acessíveis no mesmo local.

Nota: Como o acesso é controlado pelo apache, você pode adicionar quaisquer requisitos de autenticação (htaccess ou ldap, etc) à configuração de cada repositório.

Esta resposta assume que você é o proprietário do servidor remoto e deseja adicionar / corrigir o suporte http.

PRIMEIRO: Verifique os logs do apache, provavelmente é uma permissão negada / incapaz de localizar o erro quando o apache tenta executar os scripts cgi suportados pelo git-http.

Adicionando suporte HTTP ao git

Basta criar um novo arquivo git_support.conf e incluí-lo no apache (adicione a instrução include no 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/

O resultado é a capacidade de empurrar / puxar:

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

E você pode procurar essas alterações online. O gitweb fornece uma interface navegável

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

Eddie
fonte
Quando executo a linha IMPORTANTE sobre o usuário, linha 7, recebo "SetEnv takes 1-2 arguments, an environment variable name and optional value to pass to CGI."- por quê?
hhh
Eu acho que esse valor está vazio, então setenv vê apenas 0 argumentos. Como o apache usa uma regra de redirecionamento, é possível que REMOTE_USER esteja vazio, então pegamos o REDIRECT_RMEOTE_USER. Você deve poder tornar a atribuição opcional se RMEOTE_USER já estiver definido (ou melhor, se o usuário REDIRECT estiver vazio). httpd.apache.org/docs/2.0/mod/mod_setenvif.html#setenvif
7

Para habilitar um " git push " sobre http, você deve habilitar o WebDAV no servidor da web. Para fazer isso no Apache Webserver, basta editar o arquivo de configuração:

vim /etc/httpd/conf/httpd.conf

Em seguida, procure a linha que começa com:

<Directory "/var/www/html">

Adicione a seguinte linha logo após:

Dav On

Verifique se você tem a seguinte linha também no httpd.conf não comentada:

LoadModule dav_fs_module modules/mod_dav_fs.so

Depois disso você está pronto. Reinicie o Apache Webserver usando:

service httpd restart

Verifique também se todos os arquivos do repositório git no servidor podem ser gravados pelo usuário e grupo pache: apache usando:

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

Caso contrário, não definir as permissões corretas resultará em "Erro PUT: resultado da ondulação = 22, código HTTP = 403" ao executar um "push git".

Agora basta fazer um "git push" na máquina do cliente e tudo deve funcionar.

Manjericão A
fonte
Observe que, se os usuários ultrapassarem esse obstáculo, mas virem um erro nos logs do apcahe sobre o pacote de recebimento stackoverflow.com/questions/792611/…
2
Isso funcionará, mas o DAV não é necessário e, na verdade, é muito mais lento que o http inteligente.
4

Você não pode enviar por push um repositório que você clonou através do HTTP. Você precisa atualizar o URL para um ssh://ou um git://tipo de URL.

O poderoso pato de borracha
fonte
Eu usei o mesmo comando clone. Funcionou antes até que eu fiz a exclusão incorreta .... #
com o que você tem git remote -v?
The Mighty Rubber Duck
Não é inteiramente verdade. Você pode voltar aos repositórios, assumindo que o DAV esteja ativado.
6
Isto está incorreto. O Git, desde a versão 1.6.6, suporta push e pull de http inteligentes usando apache e git-http-backend.
3

Edite a seguinte seção do seu arquivo .git / config:

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

para

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

Então tente git push origin master.

Edite os detalhes de autenticação em seus arquivos de configuração para outros URLs do repositório, conforme necessário, e envie para a ramificação necessária.

Deepak
fonte
Nota: usei esse método e ele resolveu o meu problema - no entanto, pensei que armazenar a senha no arquivo de configuração parecia errado, então a deixei de fora (esperando ser solicitado) e pude usá-la como tal.
chris
git remote set-url origin ...funciona também.
Maximilian Hils
1

Eu tive o mesmo problema com a operação de envio com configuração de autenticação git-http-backend, ldap.
Finalmente encontrei a solução e a descrevo nesta questão de falha do servidor

Talvez ajude alguém com um problema semelhante.

gaspar
fonte
0

Ótimo

Eu tive outros erros, mas funciona!

eu tento explicar:

MAS como ocultar a senha do texto na mensagem de envio?

user201304010101
fonte
-1

Isso também pode acontecer se você digitar uma senha errada.

sacha
fonte
Eu nunca vi isso: eu sempre chegar fatal: Authentication failedprimeiro
Rup