git-upload-pack: commande non trouvée lors du clonage du dépôt Git distant
-
03-07-2019 - |
Question
J’ai utilisé git pour synchroniser deux copies de mon projet, l’une sur ma boîte locale, l’autre sur 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 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 de fichiers ont été modifiés pour protéger les coupables ...!)
Les deux boîtes exécutent Solaris 10 AMD. J'ai creusé, si j'ajoute - upload-pack = $ (quel git-upload-pack)
la commande fonctionne (et prouve que $ PATH
contient le chemin vers 'git-upload-pack' selon la solution RTFM), mais c’est vraiment ennuyeux, et 'git push' ne fonctionne pas, car je ne pense pas qu’il existe un - unpack = = / code > option.
Incidemment, toutes les commandes git fonctionnent correctement à partir de mon ordinateur local, il s'agit de la même version du logiciel (1.5.4.2), installée sur le même montage NFS sous / usr / local / bin
. .
Quelqu'un peut-il aider?
La solution
Assurez-vous que git-upload-pack
se trouve sur le chemin d'un shell sans connexion. (Sur ma machine, il se trouve dans / 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 shells.)
Si le chemin indiqué ne contient pas le répertoire contenant git-upload-pack
, vous devez le réparer en le définissant dans .bashrc
(pour Bash), .zshenv
(pour Zsh), .cshrc
(pour tcsh) ou l’équivalent pour votre shell.
Vous devrez effectuer cette modification sur la machine distante.
Si vous ne savez pas quel chemin vous devez ajouter à votre CHEMIN
distant, vous pouvez le trouver avec cette commande (vous devez l'exécuter sur la machine distante):
quel 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é PATH
.
Autres conseils
Vous pouvez également utiliser les " -u " option 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
Construire sur Brian répondre , le chemin du pack de téléchargement 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 de demandes d'extraction / récupération ultérieures. De même, la configuration de receive-pack élimine le besoin de - receive-pack
pour 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 .git / config
d’un référentiel.
[remote "origin"]
uploadpack = /path/to/git-upload-pack
receivepack = /path/to/git-receive-pack
Les utilisateurs fréquents de clone -u
peuvent être intéressés par les alias suivants. myclone devrait être explicite. myfetch / mypull / mypush peut être utilisé sur des pensions dont la configuration n'a pas été modifiée comme indiqué ci-dessus en remplaçant git push
par 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
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 .
Mac OS X et certains autres Unix ont au moins le chemin d’utilisateur compilé dans sshd pour des raisons de sécurité; ainsi, ceux qui installent git en tant que / usr / local / git / {bin, lib, ...} peuvent avoir des problèmes car les exécutables git ne sont pas dans le chemin précompilé. Pour éviter cela, 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
Notez que les variables ne se développent pas lorsque le fichier ~ / .ssh / environment est lu de cette manière:
PATH=$PATH:/usr/local/git/bin
ne fonctionnera pas.
Pour bash, il doit être placé dans .bashrc et non pas .bash_profile (.bash_profile ne concerne que les shells de connexion).
La solution de Matt ne fonctionnait pas pour moi sous OS X, mais celle de Paul.
La version courte du lien de Paul est la suivante:
Créé / 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
Ajoutez les éléments suivants à / etc / sshd_config
:
CommandeCommande / usr / local / bin / ssh_session
J'ai eu ces erreurs avec la version de MsysGit.
Après avoir suivi tous les conseils que je pouvais trouver ici et ailleurs, je me suis retrouvé:
installation de 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 je reçois des erreurs POSIX avec le Cygwin Git tirer de ce même serveur sshd
Je pense qu’il reste du travail à faire de ce côté de l’utilisation de Git. (ssh + facilité de traction / poussée sous Windows)
Comme Johan l'a souligné à plusieurs reprises, son .bashrc nécessaire:
ln -s .bash_profile .bashrc
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 ).
Pour zsh, vous devez le placer 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
J'ai eu des problèmes de connexion à un dépôt Gitolite avec 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 ssh gitolite @ [hôte] renverrait correctement la liste des dépôts.
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.
Ajoutez l'emplacement de votre git-upload-pack
dans le fichier .bashrc de l'utilisateur git distant.