174 votes

git-upload-pack : commande non trouvée, lors du clonage d'un repo Git distant

J'ai utilisé git pour garder deux copies de mon projet en synchronisation, l'une est ma boîte locale, l'autre le serveur de test. Le problème se produit lorsque je me connecte à notre serveur de développement distant en utilisant ssh ;

git clone me@me.mydevbox.com:/home/chris/myproject
Initialized empty Git repository in /tmp/myproject/.git/
Password:
bash: git-upload-pack: command not found
fatal: The remote end hung up unexpectedly
fetch-pack from 'me@me.mydevbox.com:/home/chris/myproject' failed.

(les noms des fichiers ont été modifiés pour protéger les coupables... !)

Les deux boîtes fonctionnent sous Solaris 10 AMD. J'ai fait quelques recherches, si j'ajoute --upload-pack=$(which git-upload-pack) la commande fonctionne, (et prouve que $PATH contient le chemin vers 'git-upload-pack' comme dans la solution RTFM) mais c'est vraiment ennuyeux, de plus 'git push' ne fonctionne pas, parce que je ne pense pas qu'il y ait un fichier --unpack= option.

Par ailleurs, toutes les commandes git fonctionnent bien depuis ma boîte locale, il s'agit de la même version du logiciel (1.5.4.2), installée sur le même support NFS à l'adresse suivante /usr/local/bin .

Quelqu'un peut-il m'aider ?

0 votes

Voir aussi stackoverflow.com/questions/1509246/ pour le cas où vous voulez utiliser un dépôt distant qui n'a pas d'accès à la base de données. git installé sur la machine distante

172voto

Matt Curtis Points 12454

Assurez-vous que git-upload-pack est sur le chemin depuis un shell non connecté. (Sur ma machine, c'est dans /usr/bin ).

Pour voir à quoi ressemble votre chemin sur la machine distante à partir d'un shell sans connexion, essayez ceci :

ssh you@remotemachine echo \$PATH

(Cela fonctionne dans Bash, Zsh, et tcsh, et probablement d'autres shells aussi).

Si le chemin qu'il renvoie n'inclut pas le répertoire qui a git-upload-pack vous devez le corriger en l'insérant dans le fichier .bashrc (pour Bash), .zshenv (pour Zsh), .cshrc (pour tcsh) ou équivalent pour votre shell.

Vous devrez effectuer cette modification sur la machine distante.

Si vous n'êtes pas sûr du chemin que vous devez ajouter à votre télécommande PATH vous pouvez le trouver avec cette commande (vous devez l'exécuter sur la machine distante) :

which git-upload-pack

Sur ma machine qui imprime /usr/bin/git-upload-pack . Donc dans ce cas, /usr/bin est le chemin dont vous devez vous assurer qu'il se trouve dans votre shell distant sans login. PATH .

2 votes

Le chemin était correct si j'exécute la commande sur ma machine, mais faux si je l'exécute dans l'autre sens. (de la machine distante vers la mienne) L'édition de mon .bashrc local a réglé le problème. Merci

0 votes

En réponse aux commentaires de Chris, j'ai constaté que lorsque la commande de Matt signalait un chemin erroné, je me suis connecté avec "ssh you@remotemachine" et j'ai modifié le .bashrc à cet endroit ; cela a réglé le problème. Changer le .bashrc "local" ne fait aucune différence à ce que je vois.

0 votes

Je m'étais connecté à une machine distante en essayant de tirer du système local, c'est pourquoi mon .bashrc était celui à modifier. C'est le même problème que vous, mais inversé.

67voto

Brian Hawkins Points 1037

Vous pouvez également utiliser l'option "-u" pour spécifier le chemin. Je trouve cela utile sur les machines où mon .bashrc n'a pas de source dans les sessions non-interactives. Par exemple,

git clone -u /home/you/bin/git-upload-pack you@machine:code

2 votes

Juste pour noter : ici sont des instructions sur la façon de faire en sorte que le fichier .bashrc soit récupéré lors des sessions ssh.

62voto

Garrett Points 5477

Construire sur Réponse de Brian le chemin du pack d'envoi peut être défini de manière permanente en exécutant les commandes suivantes après le clonage, ce qui élimine le besoin d'utiliser la fonction d'envoi de paquets. --upload-pack sur les requêtes pull/fetch suivantes. De même, la configuration de receive-pack élimine le besoin de --receive-pack sur les demandes de push.

git config remote.origin.uploadpack /path/to/git-upload-pack
git config remote.origin.receivepack /path/to/git-receive-pack

Ces deux commandes sont équivalentes à l'ajout des lignes suivantes dans le fichier de référence d'un repo .git/config .

[remote "origin"]
    uploadpack = /path/to/git-upload-pack
    receivepack = /path/to/git-receive-pack

Les utilisateurs fréquents de clone -u peut être intéressé par les alias suivants. myclone devrait être auto-explicatif. myfetch/mypull/mypush peut être utilisé sur les dépôts dont la configuration n'a pas été modifiée comme décrit ci-dessus en remplaçant git push avec git mypush et ainsi de suite.

[alias]
    myclone = clone --upload-pack /path/to/git-upload-pack
    myfetch = fetch --upload-pack /path/to/git-upload-pack
    mypull  = pull --upload-pack /path/to/git-upload-pack
    mypush  = push --receive-pack /path/to/git-receive-pack

0 votes

J'ai essayé votre suggestion, j'ai également ajouté "which git-receive-pack" au chemin d'accès dans .bashrc mais d'une manière ou d'une autre, git push ne fonctionne toujours pas pour moi, alors que le téléchargement du repo fonctionne bien. Une idée de la raison pour laquelle cela pourrait se produire ?

0 votes

@coredump, la définition de "remote.origin.receivepack" devrait éliminer la nécessité de modifier le PATH dans votre .bashrc. Essayez git push --receive-pack /full/path/to/git-receive-pack jusqu'à ce qu'il réussisse, puis modifiez .git/config (ou lancez "git config") pour définir de façon permanente le chemin du paquet de réception.

0 votes

Merci à tous pour vos réponses ! Dans mon cas, le serveur de récupération et le serveur de poussée étaient différents et le serveur de récupération n'avait pas les droits d'écriture. Lorsque j'utilise git push <push-server> <branch>tout fonctionne bien.

30voto

Andy Points 2015

J'ai trouvé et utilisé (avec succès) ce correctif :

# Fix it with symlinks in /usr/bin
$ cd /usr/bin/
$ sudo ln -s /[path/to/git]/bin/git* .

Merci à Paul Johnston .

12voto

tom Points 91

Mac OS X et certains autres Unixes ont au moins le chemin de l'utilisateur compilé dans sshd pour des raisons de sécurité. Ceux d'entre nous qui installent git sous /usr/local/git/{bin,lib,...} peuvent avoir des problèmes car les exécutables de git ne sont pas dans le chemin précompilé. Pour contourner cela, je préfère éditer mon /etc/sshd_config en le modifiant :

#PermitUserEnvironment no

à

PermitUserEnvironment yes

puis créez des fichiers ~/.ssh/environnement si nécessaire. Mes utilisateurs de git ont les éléments suivants dans leur fichier ~/.ssh/environnement :

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin

Notez que l'expansion des variables ne se produit pas lorsque le fichier ~/.ssh/environnement est lu ainsi :

PATH=$PATH:/usr/local/git/bin

ne fonctionnera pas.

0 votes

Cela semble être l'astuce parfaite, mais cela ne fonctionne pas ici pour 10.6.6. ssh user@host echo \$PATH affiche toujours le chemin de construction codé en dur. J'ai ajouté .ssh/environment avec un chemin requis non extensible. Modification de /etc/sshd_config PermitUserEnvironment yes. no dice. Des suggestions ? Merci.

0 votes

J'ai également essayé de définir BASH_ENV='~/.nibashrc' sur l'ordinateur client et de créer un fichier avec le chemin d'accès élargi.

0 votes

Ok. donc mettre le chemin dans .bashrc sur la machine à laquelle vous vous connectez a fonctionné pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X