web-dev-qa-db-fra.com

git-upload-pack: commande non trouvée lors du clonage du dépôt Git distant

J'utilise git pour synchroniser deux copies de mon projet, l'une est ma boîte locale, l'autre le serveur de test. C'est un problème qui se produit lorsque je me connecte à notre serveur de développement distant à l'aide de ssh;

git clone [email protected]:/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 '[email protected]:/home/chris/myproject' failed.

(les noms de 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 d'accès à 'git-upload-pack' selon le RTFM solution) mais c’est vraiment ennuyeux, en plus, 'git Push' ne fonctionne pas, car je ne pense pas qu’il existe une option --unpack=.

Incidemment, toutes les commandes git fonctionnent correctement à partir de ma boîte locale, il s'agit de la même version du logiciel (1.5.4.2), installée sur le même montage NFS à /usr/local/bin.

Quelqu'un peut aider?

169
Chris Huang-Leaver

Assure-toi git-upload-pack est sur le chemin d'un shell non connecté. (Sur ma machine c'est en /usr/bin).

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

ssh you@remotemachine echo \$PATH

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

Si le chemin indiqué ne comprend pas le répertoire qui contient git-upload-pack, vous devez le réparer en le plaçant dans .bashrc (pour Bash), .zshenv (pour Zsh), .cshrc (pour tcsh) ou équivalent pour votre shell.

Vous devrez effectuer ce changement sur la machine distante.

Si vous ne savez pas quel chemin 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 que vous devez vous assurer que se trouve dans votre shell distant non-connecté Shell PATH.

169
Matt Curtis

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

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

En s'appuyant sur réponse de Brian , le chemin de téléchargement-pack peut être défini de manière permanente en exécutant les commandes suivantes après le clonage, ce qui élimine le besoin de --upload-pack lors des demandes d'extraction/récupération ultérieures. De même, la configuration de receive-pack élimine le besoin de --receive-pack sur les demandes Push.

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

Ces deux commandes équivalent à l’ajout des lignes suivantes au fichier .git/config.

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

Utilisateurs fréquents de clone -u peut être intéressé par les alias suivants. myclone devrait être explicite. myfetch/mypull/mypush peut être utilisé sur des 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, etc.

[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
56
Garrett

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 .

30
Andy

Mac OS X et quelques autres Unix au moins ont le chemin utilisateur compilé dans sshd pour des raisons de sécurité; ainsi, ceux d'entre nous qui installons git en tant que/usr/local/git/{bin, lib, ...} peuvent rencontrer des problèmes en tant que git les exécutables ne sont pas dans le chemin précompilé. Pour remplacer ceci, je préfère modifier mon/etc/sshd_config en changeant:

#PermitUserEnvironment no

à

PermitUserEnvironment yes

puis créez les fichiers ~/.ssh/environment selon vos besoins. Mes utilisateurs git ont les éléments suivants dans leur fichier ~/.ssh/environment:

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

Remarque le développement de variable ne se produit pas lorsque le fichier ~/.ssh/environment est lu, ainsi:

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

ne fonctionnera pas.

12
tom

Pour bash, il doit être placé dans .bashrc et non pas .bash_profile (.bash_profile ne concerne que les shells de connexion).

7
Johan Almqvist

La solution de Matt ne fonctionnait pas pour moi sous OS X, mais celle de Paul.

La version courte du lien de Paul est:

Établi /usr/local/bin/ssh_session avec le texte suivant:

#!/bin/bash
export SSH_SESSION=1
if [ -z "$SSH_ORIGINAL_COMMAND" ] ; then
    export SSH_LOGIN=1
    exec login -fp "$USER"
else
    export SSH_LOGIN=
    [ -r /etc/profile ] && source /etc/profile
    [ -r ~/.profile ] && source ~/.profile
    eval exec "$SSH_ORIGINAL_COMMAND"
fi

Exécuter:

chmod +x /usr/local/bin/ssh_session

Ajouter ce qui suit à /etc/sshd_config:

ForceCommand/usr/local/bin/ssh_session

6
Skeletron

J'ai eu ces erreurs avec la version MsysGit.

Après avoir suivi tous les conseils que je pouvais trouver ici et ailleurs, je me suis retrouvé:

installer la version Cygwin de Git

sur le serveur (Win XP avec Cygwin SSHD), cela a finalement résolu le problème.

J'utilise toujours le côté client de la version MsysGit

..en fait, c’est la seule façon dont cela fonctionne pour moi, car j’obtiens des erreurs POSIX avec le pull Cygwin Git à partir du même serveur sshd

Je soupçonne qu’un peu de travail est encore nécessaire de ce côté de l’utilisation de Git. (Ssh + facilité de tirage/Push in Windows)

5
Ric Tokyo

Comme Johan a souligné à plusieurs reprises son .bashrc qui est nécessaire:

ln -s .bash_profile .bashrc

1
Stefan Lundström

Vous devez ajouter le

export PATH=/opt/git/bin:$PATH

avant cette ligne dans le fichier .bashrc:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Sinon, toutes les instructions d'exportation ne seront pas exécutées ( voir ici ).

1
Dennis

J'ai eu des problèmes de connexion à un dépôt Gitolite en utilisant SSH sous Windows et il s'est avéré que mon problème était PLINK! Il n'arrêtait pas de me demander un mot de passe, mais le serveur ssh gitolite @ [hôte] renverrait correctement la liste des pensions.

Vérifiez votre variable d'environnement: GIT_SSH. S'il est défini sur Plink, essayez-le sans valeur ("set GIT_SSH =") et voyez si cela fonctionne.

0
RAVolt

Pour zsh, vous devez le mettre dans ce fichier: ~/.zshenv

Par exemple, sur OS X utilisant le paquet git-core de MacPorts:

$ echo 'export PATH =/opt/local/sbin:/opt/local/bin: $ PATH'> ~/.zshenv

0
miknight

Ajoutez l'emplacement de votre git-upload-pack au fichier .bashrc de l'utilisateur git distant.

0
Yeison

Mon cas est sur Win 10 avec GIT bash et je n'ai pas de GIT sous un emplacement standard. Au lieu de cela, j'ai git sous/app/local/bin. J'ai utilisé les commandes fournies par @Garrett mais j'ai besoin de changer le chemin pour commencer par double /:

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

Sinon, le GIT ajoutera votre chemin Windows GIT devant.

0
felixc