git push fatal falló


24

De alguna manera eliminé todo el directorio de mi rama de código. Cloné uno nuevo. Funcionó bien excepto empujar.

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

Sin embargo, git pull funciona. ¿Cómo puedo arreglarlo?

git  push 

1
Por favor, lea este manual aquí y observe el punto al respecto http.receivepack.
hhh

Respuestas:


33

Cometí el error de usar https en lugar de ssh para obtener una copia nueva. Desde entonces hice modificaciones y confirmaciones, pero no pude presionar por razones obvias.

Para recuperar, simplemente cambié la sección ["origen" remoto] en .git / config de

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

a

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

Después de eso, podría presionar nuevamente.


2
No es necesario pasar a otro protocolo, lea mi respuesta a continuación si desea pasar http.
Basilio A

1
De acuerdo con Basil, esto es innecesario e imposible en algunos entornos corporativos que tienen acceso limitado a través de firewalls, etc.

... el problema es git-http-push failed, veo que el operador está tratando de configurar las cosas a través de http o https, -1.
hhh

14

HTTP Push más rápido con solo git: no se requiere webDAV

El nuevo soporte "smart-http" desde git 1.6.6. El nuevo método permite que todo el paquete se transmita a la vez, y no como archivos individuales.

También puede usar gitweb para proporcionar URL navegables en la misma ubicación.

Nota: Debido a que el acceso está controlado por apache, puede agregar cualquier requisito de autenticación (htaccess o ldap, etc.) a la configuración de cada repositorio.

Esta respuesta asume que usted es el propietario del servidor remoto y desea agregar / corregir el soporte http.

PRIMERO: Verifique los registros de apache, es probable que sea un permiso denegado / no se puede localizar el error cuando apache intenta ejecutar los scripts cgi respaldados por git-http.

Agregar soporte HTTP a git

Simplemente cree un nuevo archivo git_support.conf e inclúyalo en apache (agregue la declaración de inclusión en 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/

El resultado es la capacidad de empujar / tirar:

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

Y puede navegar por esos cambios en línea ... gitweb proporciona una interfaz navegable

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


Cuando ejecuto la línea IMPORTANTE sobre el usuario, línea 7, obtengo "SetEnv takes 1-2 arguments, an environment variable name and optional value to pass to CGI.", ¿por qué?
hhh

Supongo que el valor está vacío, por lo que setenv solo ve 0 argumentos. Debido a que el apache usa una regla de redireccionamiento, es posible que REMOTE_USER esté vacío, por lo que tomamos REDIRECT_RMEOTE_USER. Debería poder hacer la asignación opcional si RMEOTE_USER ya está definido (o si REDIRECT está vacío). httpd.apache.org/docs/2.0/mod/mod_setenvif.html#setenvif

7

Para habilitar un " git push " sobre http, debe habilitar WebDAV en el servidor web. Para hacer eso para el servidor web Apache, simplemente edite el archivo de configuración:

vim /etc/httpd/conf/httpd.conf

Luego busque la línea que comienza con:

<Directory "/var/www/html">

Agregue la siguiente línea justo después:

Dav On

Asegúrese de tener la siguiente línea también en httpd.conf sin comentarios:

LoadModule dav_fs_module modules/mod_dav_fs.so

Después de eso estás listo. Reinicie el servidor web Apache usando:

service httpd restart

También asegúrese de que todos los archivos del repositorio git en el servidor puedan ser escritos por el usuario y grupo pache: apache usando:

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

De lo contrario, si no se configuran los permisos correctos, se producirá un "error PUT: resultado de curl = 22, código HTTP = 403" al realizar un "git push".

Ahora simplemente haga un "git push" desde su máquina cliente y todo debería funcionar.


Tenga en cuenta que si los usuarios superan este obstáculo, pero ven un error en los registros de apcahe sobre el paquete de recepción stackoverflow.com/questions/792611/…

2
Esto funcionará, pero no se requiere DAV , y en realidad funciona mucho más lento que smart-http.

4

No puede presionar un repositorio que clonó a través de HTTP. Debe actualizar la URL a una ssh://o una git://URL de tipo.


Usé el mismo comando de clonación. Funcionó antes hasta que hice la eliminación incorrecta ...

¿Qué tienes con git remote -v?
The Mighty Rubber Duck

No del todo cierto. Puede retroceder a los repositorios, suponiendo que DAV esté habilitado.

66
Esto es incorrecto. Git desde 1.6.6 admite push y pulls http inteligentes usando apache y git-http-backend.

3

Edite la siguiente sección de su archivo .git / config:

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

a

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

Entonces inténtalo git push origin master.

Edite los detalles de autenticación en sus archivos de configuración para otras URL de repositorio según sea necesario y avance a la rama requerida.


Nota: utilicé este método y resolvió mi problema; sin embargo, pensé que almacenar la contraseña en el archivo de configuración parecía incorrecto, así que lo dejé (con la esperanza de que me lo solicitaran) y pude usarlo como tal.
chris

git remote set-url origin ...funciona igual de bien
Maximilian Hils

1

Tuve el mismo problema con la operación de inserción con git-http-backend, configuración de autenticación ldap.
Finalmente encontré la solución y la describí en esta pregunta por defecto del servidor

Tal vez ayude a alguien con un problema similar.


0

Excelente

Tuve otros errores pero funciona!

trato de explicar:

¿PERO cómo ocultar la contraseña del texto en el mensaje push?


-1

Esto también puede suceder si ingresó una contraseña incorrecta.


Nunca he visto eso: siempre llego fatal: Authentication failedprimero
Rup
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.