git-upload-pack: commande introuvable, lors du clonage du dépôt Git distant

170

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 en utilisant 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îtiers exécutent Solaris 10 AMD. J'ai fait quelques recherches, si j'ajoute --upload-pack=$(which git-upload-pack)la commande fonctionne, (et prouve qu'elle $PATHcontient le chemin vers 'git-upload-pack' selon la solution RTFM) mais c'est vraiment ennuyeux, plus 'git push' ne fonctionne pas, parce que je ne pense pas qu'il y ait une --unpack=option.

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

Quelqu'un peut-il aider?

Chris Huang-Leaver
la source

Réponses:

169

Assurez-vous qu'il se git-upload-packtrouve sur le chemin d'un shell non connecté. (Sur ma machine, c'est dedans /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 rend n'inclut pas le répertoire qui a git-upload-pack, vous devez le corriger en le définissant dans .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 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/binest le chemin dont vous devez vous assurer qu'il se trouve dans votre shell distant sans connexion PATH.

Matt Curtis
la source
2
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 à la mienne) La modification de mon .bashrc local l'a corrigé. Merci
Chris Huang-Leaver
6
A travaillé sur OSX Leopard
Noah Campbell le
1
Dans mon cas, la commande n'a pas été trouvée car git a été installé via MacPorts, ce qui la place /opt/local/bin. L'ajout de cela à mon .bashrcvia a PATH=$PATH:/new/path/herefonctionné pour moi.
Ben Scheirman
1
@ranReloaded La barre oblique inverse est censée échapper au signe dollar et empêcher l'expansion de $ PATH sur la machine locale, et à la place passer littéralement "echo $ PATH" à la machine distante. Cela peut dépendre du shell que vous utilisez; cela fonctionne pour moi dans zsh et bash. Vous pourrez peut-être obtenir le bon résultat en utilisant des guillemets simples, par exemple "ssh you @ remotemachine 'echo $ PATH'" - essayez-le. Sinon, quel shell utilisez-vous? Peut-être que quelqu'un d'autre utilise ce shell et peut vous donner la solution de contournement.
Matt Curtis le
3
@ranReloaded: Quand vous dites "le chemin git n'est pas affiché", voulez-vous dire que ssh montre beaucoup de choses mais pas le chemin sur lequel se trouve git? Si tel est le cas, vous rencontrez exactement le même problème que l'OP, et l'utilisation d'un lien symbolique n'est qu'un pansement. La "ssh .. echo \$PATH" commande vous montrera le chemin sur la machine distante, qui peut être différent de votre chemin de connexion, mais c'est la chose cruciale à faire pour que cela fonctionne, et vous pouvez le faire en définissant PATH pour inclure git dans le .bashrcsur le machine distante. Selon la page de manuel, .profile/ .bash_profilene sont lus que pour les connexions interactives.
Matt Curtis
66

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

git clone -u /home/you/bin/git-upload-pack you@machine:code
Brian Hawkins
la source
2
Merci pour ça. Je ne voulais vraiment pas changer le fichier ~ / .bashrc.
Luis
2
Juste à noter: voici des instructions sur la façon de faire en sorte que .bashrc soit source sur les sessions ssh.
sp3ctum
58

En s'appuyant sur la réponse de Brian , le chemin de téléchargement du 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-packrequêtes d'extraction / extraction ultérieures. De même, la configuration de receive-pack élimine le besoin de --receive-packdemandes 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 à un dépôt .git/config.

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

Les utilisateurs fréquents de clone -upeuvent être intéressés par les alias suivants. myclone doit être explicite. 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 pushpar 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
Garrett
la source
Merci d'avoir mentionné l' --receive-packoption à git-push!
Axel
1
Merci d'avoir mentionné les options de configuration, c'est une touche utile de l'espace utilisateur.
Aron Ahmadia
J'ai essayé votre suggestion, j'ai également ajouté "which git-receive-pack" au chemin dans .bashrc, mais d'une manière ou d'une autre, git push ne fonctionne toujours pas pour moi, bien que le téléchargement de repo fonctionne bien. Une idée de pourquoi cela pourrait arriver?
coredump
@coredump, définir "remote.origin.receivepack" devrait éliminer le besoin de modifier PATH dans votre .bashrc. Essayez git push --receive-pack /full/path/to/git-receive-packpar vous-même, ajustez jusqu'à ce que cela réussisse, puis modifiez .git / config (ou exécutez "git config") pour définir définitivement le chemin du pack de réception.
Garrett
Merci à tous pour vos réponses! Dans mon cas, le serveur d'extraction et le serveur push étaient différents et le serveur d'extraction n'avait pas d'autorisations d'écriture. quand j'utilise git push <push-server> <branch> tout fonctionne bien.
coredump
30

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 .

Andy
la source
réparé pour moi aussi. Merci!
John Ballinger
12

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

#PermitUserEnvironment no

à

PermitUserEnvironment yes

puis créez les fichiers ~ / .ssh / environnement selon vos besoins. Mes utilisateurs git ont ce qui suit 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 / environment est lu ainsi:

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

ne fonctionnera pas.

à M
la source
Cela semble être le conseil parfait, mais cela ne fonctionne pas ici pour 10.6.6. ssh user @ host echo \ $ PATH affiche toujours le chemin de construction codé en dur. Ajout de .ssh / environnement avec un chemin requis non extensible. Modification de / etc / sshd_config PermitUserEnvironment oui. pas de dé. Aucune suggestion? Merci.
Papa
J'ai également essayé de définir BASH_ENV = '~ / .nibashrc' sur la machine cliente et de créer un fichier avec le chemin étendu. pas de dés non plus.
Papa
D'accord. donc mettre le chemin dans .bashrc sur la machine à laquelle vous vous connectez a fonctionné pour moi.
Papa
merci pour le conseil sur l'expansion variable ne fonctionne pas pour .ssh / environnement
Denis
Votez pour avoir expliqué que l'expansion var fonctionne.
XMAN
7

La solution de Matt n'a pas fonctionné pour moi sur OS X, mais celle de Paul.

La version courte du lien de Paul est:

Créé /usr/local/bin/ssh_sessionavec 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 ce qui suit à /etc/sshd_config:

ForceCommand / usr / local / bin / ssh_session

Squelette
la source
Intéressant d'entendre que cela n'a pas fonctionné pour vous. Cela vous dérange-t-il de dire ce que PATH sur la machine distante était lorsque vous avez exécuté "ssh you @ remote \ $ PATH"?
Matt Curtis
7

Pour bash, il doit être placé dans .bashrc et non dans .bash_profile (.bash_profile est également uniquement pour les shells de connexion).

Andrew Grimm
la source
5

J'ai eu ces erreurs avec la version MsysGit.

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

installer la version Cygwin de Git

sur le serveur (Win XP avec Cygwin SSHD), cela l'a finalement corrigé.

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 de ce même serveur sshd

Je soupçonne que du travail est encore nécessaire de ce côté de l'utilisation de Git. (Ssh + facilité de pull / push sous Windows)

Ric Tokyo
la source
1

Comme Johan l'a souligné à plusieurs reprises, son .bashrc est nécessaire:

ln -s .bash_profile .bashrc

Stefan Lundström
la source
1

Vous devez ajouter le

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

avant cette ligne dans le .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 ).

Dennis
la source
1

Mon cas est sur Win 10 avec GIT bash et je n'ai pas de GIT sous l'emplacement standard. Au lieu de cela, j'ai git sous / app / local / bin. J'ai utilisé les commandes fournies par @Garrett mais je dois 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 à l'avant.

Felixc
la source
0

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

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

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

Miknight
la source
0

J'ai eu des problèmes de connexion à un référentiel Gitolite en utilisant SSH à partir de 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 ssh gitolite @ [host] renverrait la liste des dépôts très bien.

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

RAVolt
la source
0

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

Yeison
la source
0

Cela peut être aussi simple que d'installer git sur l'hôte distant (comme c'était le cas dans mon cas).

sudo apt-get install git

Ou équivalent pour d'autres systèmes de gestion de paquets.

truefusion
la source