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?
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
.
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
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
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 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.
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:
É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
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)
Comme Johan a souligné à plusieurs reprises son .bashrc qui est 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 ).
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.
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
Ajoutez l'emplacement de votre git-upload-pack
au fichier .bashrc de l'utilisateur git distant.
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.