web-dev-qa-db-fra.com

Impossible de transférer Git dans un référentiel distant avec http/https

J'ai un référentiel Git dans un répertoire servi par Apache sur un serveur. J'ai configuré WebDAV et il semble fonctionner correctement. Litmus renvoie 100% de succès.

Je peux cloner mon référentiel à partir d'un hôte distant, mais le message d'erreur suivant s'affiche lorsque j'essaie de transmettre par HTTP ou par https:

error: Impossible d'accéder à l'URL https://git.example.com/repo/ , code retour 22 fatal: git-http-Push a échoué

Une idée?

20
Clément

Il est fortement recommandé de NE PAS utiliser WebDAV si possible. Si vous devez utiliser HTTP/HTTPS, l'utilisation du script git-http-backend CGI est recommandée par rapport à WebDAV.

11
Arrowmaster

Modifiez la section suivante de votre fichier .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

Ensuite, essayez git Push Origin master.

Modifiez les informations d'authentification dans vos fichiers de configuration pour les autres URL du référentiel, si nécessaire, et transférez-les vers la branche requise.

34
Deepak

Comme dans ce commentaire post , que dit votre /Web/git/Logs/ErrorLog à propos de cette erreur?

Après avoir regardé dans /Web/git/Logs/ErrorLog, j’ai découvert qu’il y avait un problème d’autorisation sur le fichier de verrouillage . Dans mon httpd-dav.conf, j'ai la ligne…

DavLockDB “/usr/var/DavLock”

J'ai ensuite vérifié le répertoire /usr/, le répertoire ‘var’ était manquant.

$ mkdir var
$ cd var
$ chown www .
$ chgrp www .

Et puis répéter le processus semble que maintenant je peux pousser !! =)


Comme mentionné par Eddie dans les commentaires et par Arrowmaster dans son _ (voté) answer , le protocole smart http fait maintenant partie de la récente distribution Git.
Le script CGI git-http-backend peut s’occuper de toutes les commandes git via http.

smart http

Les protocoles les plus intelligents (git et ssh) auraient plutôt une conversation avec le processus git upload-pack sur le serveur, qui déterminerait le jeu exact d’objets dont le client a besoin et construirait un fichier de compression personnalisé contenant uniquement ces objets et le diffuser.


Git 2.17 (T2 2018) ajoutera une aide au débogage.

Voir commit a2b9820 (24 janvier 2018) de Patryk Obara (dreamer) .
(Fusion de Junio ​​C Hamano - gitster - dans commit 39a1dd8 , 13 février 2018)

http-Push: améliore le journal des erreurs

Lorsque git Push échoue à cause d'une erreur WebDAV côté serveur, il n'est pas facile de pointez sur le principal coupable.
Des informations supplémentaires sur l'erreur exacte cURL et la réponse du serveur HTTP sont utiles pour le débogage.

3
VonC

J'ai le même problème et j'ai trouvé les solutions, ce sera peut-être utile pour quelqu'un. 
Ici est ma solution avec la configuration git-http-backend et l’authentification LDAP.

2
gaspar

vous devrez peut-être ajouter l'utilisateur en tant que membre du référentiel et éventuellement mettre à jour les autorisations.

nous devions le faire avec chaque membre qui contribuerait au référentiel github de notre organisation.

2
JrBriones

J'ai eu le même problème sous Windows, où mes informations d'identification sont stockées dans le gestionnaire d'informations d'identification Windows. Je ne voulais pas que chaque utilisateur doive éditer le fichier de configuration, j'ai donc changé l'URL de http://example.com en http: //[email protected] et cela fonctionne même si mon id n'est pas git. Je ne pense pas qu'un utilisateur "git" soit défini nulle part et suppose qu'un nom quelconque fonctionnera. (Si vous n'êtes pas sur un réseau privé, assurez-vous d'utiliser https).

1
Robert Murphy

J'ai eu un problème similaire dans lequel je pouvais cloner et extraire du référentiel à l'aide du protocole HTTP, mais je n'étais pas capable de Push. J'ai résolu ceci en procédant comme suit.

J'ai modifié l'URL de la télécommande dans le fichier .git/config du projet afin qu'il corresponde à l'URL GitHub SSH. J'ai ensuite suivi toutes les instructions sur " https://help.github.com/articles/generating-ssh-keys#platform-linux " et j'ai résolu le problème avec " https://help.github.com/articles/error-permission-denied-publickey ". La meilleure partie est que je n'ai pas eu à traiter avec Apache ou modifier les paramètres HTTP sur le serveur distant.

1
FearlessFuture

En exemple d’écriture authentifiée git dav virtualhost avec gitweb enable qui pourrait résoudre votre problème:

<VirtualHost *:443>
        ServerAdmin [email protected]
        ServerName git.example.com

        DocumentRoot /var/git

        # SSL configuration
        SSLEngine on

        # Fix dav header
        #RequestHeader edit Destination ^https: http: early

        <Directory /var/git>
                DAV on
                Options ExecCgi FollowSymLinks

                # Gitweb config
                AddHandler cgi-script .cgi
                DirectoryIndex .gitweb.cgi
                SetEnv GITWEB_CONFIG /var/git/.gitweb.conf

                # Basic auth config
                AuthType Basic

                # Auth title
                AuthName "Git repositories"

                # Use file and external providers
                AuthBasicProvider file

                # File location
                AuthUserFile /var/git/.htpasswd

                Require method GET OPTIONS PROPFIND
                <LimitExcept GET OPTIONS PROPFIND>
                        Require valid-user
                </LimitExcept>
        </Directory>
</VirtualHost>

Ensuite, il suffit de cloner votre référentiel avec votre utilisateur:

git clone https://[email protected]/repository

Et quand vous essayerez de pousser, il demandera votre mot de passe et le fournira.

Placer le mot de passe dans l'URL de clonage est une mauvaise pratique de sécurité car tout le monde peut le lire dans votre fichier .git/config.

0
Raphaël Gertz