git-upload-pack: comando no encontrado, al clonar el repositorio remoto de Git

170

He estado usando git para mantener sincronizadas dos copias de mi proyecto, una es mi caja local y la otra el servidor de prueba. Este es un problema que ocurre cuando inicio sesión en nuestro servidor de desarrollo remoto usando 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.

(¡los nombres de los archivos se han cambiado para proteger al culpable ...!)

Ambas cajas ejecutan Solaris 10 AMD. He cavado un poco, si agrego --upload-pack=$(which git-upload-pack)el comando funciona (y demuestra que $PATHcontiene la ruta a 'git-upload-pack' según la solución RTFM) pero esto es realmente molesto, además de 'git push' no funciona, porque no creo que haya una --unpack=opción

Por cierto, todos los comandos git funcionan bien desde mi caja local, es la misma versión del software (1.5.4.2), instalada en el mismo soporte NFS en /usr/local/bin.

¿Alguien puede ayudar?

Chris Huang-Leaver
fuente

Respuestas:

169

Asegúrese de que git-upload-packesté en la ruta desde un shell sin inicio de sesión. (En mi máquina está adentro /usr/bin).

Para ver cómo se ve su ruta en la máquina remota desde un shell sin inicio de sesión, intente esto:

ssh you@remotemachine echo \$PATH

(Eso funciona en Bash, Zsh y tcsh, y probablemente también en otros shells).

Si la ruta que devuelve no incluye el directorio que tiene git-upload-pack, debe solucionarlo configurándolo en .bashrc(para Bash), .zshenv(para Zsh), .cshrc(para tcsh) o equivalente para su shell.

Deberá realizar este cambio en la máquina remota.

Si no está seguro de qué ruta debe agregar a su control remoto PATH, puede encontrarlo con este comando (debe ejecutar esto en la máquina remota):

which git-upload-pack

En mi máquina que imprime /usr/bin/git-upload-pack. Entonces, en este caso, /usr/bines la ruta que debe asegurarse de estar en su shell remoto sin inicio de sesión PATH.

Matt Curtis
fuente
2
La ruta era correcta si ejecutaba el comando en mi máquina, pero incorrecta si la ejecutaba al revés. (desde la máquina remota de regreso a la mía) La edición de mi .bashrc local lo arregló. Gracias
Chris Huang-Leaver
66
Trabajó en OSX Leopard
Noah Campbell el
1
En mi caso, el comando no se encontró porque git se instaló a través de MacPorts, lo que lo coloca /opt/local/bin. Agregar esto a mi .bashrcvía PATH=$PATH:/new/path/herefuncionó para mí.
Ben Scheirman
1
@ranReloaded Se supone que la barra invertida escapa del signo del dólar y evita la expansión de $ PATH en la máquina local, y en su lugar pasa "echo $ PATH" literalmente a la máquina remota. Puede depender de qué shell está utilizando; me funciona en zsh y bash. Es posible que pueda obtener el resultado correcto utilizando comillas simples, por ejemplo, "ssh you @ remotemachine 'echo $ PATH'" - inténtelo. De lo contrario, ¿qué shell estás usando? Quizás alguien más aquí use ese shell y pueda darle la solución.
Matt Curtis
3
@ranReloaded: Cuando dices "la ruta git no está impresa", ¿quieres decir que ssh muestra muchas cosas pero no la ruta en la que está git? Si es así, tiene el mismo problema que tenía el OP, y usar un enlace simbólico es solo una venda. El "ssh .. echo \$PATH" comando le mostrará la ruta en la máquina remota, que puede ser diferente a su ruta de inicio de sesión, pero esto es lo más importante para hacer que funcione, y puede hacerlo configurando PATH para incluir git en .bashrcel máquina remota Según la página de manual, .profile/ .bash_profilesolo se leen para inicios de sesión interactivos.
Matt Curtis
66

También puede usar la opción "-u" para especificar la ruta. Esto me resulta útil en máquinas donde mi .bashrc no se obtiene en sesiones no interactivas. Por ejemplo,

git clone -u /home/you/bin/git-upload-pack you@machine:code
Brian Hawkins
fuente
2
Gracias por eso. Realmente no quería cambiar el archivo ~ / .bashrc.
Luis
2
Solo para tener en cuenta: aquí hay instrucciones sobre cómo hacer que .bashrc se obtenga en sesiones ssh.
sp3ctum
58

Sobre la base de la respuesta de Brian , la ruta del paquete de carga se puede establecer de forma permanente ejecutando los siguientes comandos después de la clonación, lo que elimina la necesidad de --upload-packsolicitudes posteriores de extracción / extracción. Del mismo modo, configurar el paquete de recepción elimina la necesidad de --receive-packsolicitudes push.

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

Estos dos comandos son equivalentes a agregar las siguientes líneas a un repositorio .git/config.

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

Los usuarios frecuentes de clone -upueden estar interesados ​​en los siguientes alias. myclone debería explicarse por sí mismo. myfetch / mypull / mypush se puede usar en repos cuya configuración no se ha modificado como se describió anteriormente al reemplazar git pushcon git mypush, y así sucesivamente.

[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
fuente
Gracias por mencionar la --receive-packopción git-push!
Axel
1
Gracias por mencionar las opciones de configuración, es un toque útil desde el espacio del usuario.
Aron Ahmadia
Intenté su sugerencia, también agregué "which git-recibir-paquete" a la ruta en .bashrc pero de alguna manera git push todavía no funciona para mí, aunque la carga de repositorio funciona bien. ¿Alguna idea de por qué esto podría suceder?
coredump
@coredump, la configuración de "remote.origin.receivepack" debería eliminar la necesidad de modificar PATH en su .bashrc. Pruebe git push --receive-pack /full/path/to/git-receive-packpor sí mismo, modifique hasta que tenga éxito, luego modifique .git / config (o ejecute "git config") para establecer permanentemente la ruta del paquete de recepción.
Garrett
¡Gracias a todos por sus respuestas! En mi caso, el servidor de recuperación y el servidor de inserción eran diferentes y el servidor de recuperación no tenía permisos de escritura. cuando uso git push <push-server> <branch> todo funciona bien.
coredump
30

Encontré y usé (con éxito) esta solución:

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

Gracias a Paul Johnston .

Andy
fuente
arreglado para mí también. ¡Gracias!
John Ballinger
12

Mac OS X y algunos otros Unix al menos tienen la ruta de usuario compilada en sshd por razones de seguridad para que aquellos de nosotros que instalemos git como / usr / local / git / {bin, lib, ...} puedan tener problemas como git los ejecutables no están en la ruta precompilada. Para anular esto, prefiero editar mi / etc / sshd_config change:

#PermitUserEnvironment no

a

PermitUserEnvironment yes

y luego cree archivos ~ / .ssh / environment según sea necesario. Mis usuarios de git tienen lo siguiente en su archivo ~ / .ssh / environment:

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

Tenga en cuenta que la expansión variable no se produce cuando el archivo ~ / .ssh / environment se lee así:

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

no trabajará.

tom
fuente
Este parece ser el consejo perfecto, pero no funciona aquí para 10.6.6. ssh user @ host echo \ $ PATH todavía muestra la ruta de compilación codificada. Se agregó .ssh / environment con una ruta requerida que no se expande. Cambió / etc / sshd_config PermitUserEnvironment yes. no dados. ¿Alguna sugerencia? Gracias.
Papá
También intenté configurar BASH_ENV = '~ / .nibashrc' en la máquina del cliente y hacer un archivo con la ruta expandida. Tampoco dados.
Papá
Okay. así que poner la ruta en .bashrc en la máquina a la que se está conectando funcionó para mí.
Papá
gracias por el consejo sobre la expansión variable que no funciona para .ssh / environment
Denis
Voto por explicar que la expansión var funciona.
XMAN
7

La solución de Matt no funcionó para mí en OS X, pero la de Paul sí.

La versión corta del enlace de Paul es:

Creado /usr/local/bin/ssh_sessioncon el siguiente texto:

#!/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

Ejecutar:

chmod +x /usr/local/bin/ssh_session

Agregue lo siguiente a /etc/sshd_config:

ForceCommand / usr / local / bin / ssh_session

Skeletron
fuente
Interesante escuchar que no funcionó para ti. ¿Le importaría decir lo que decía PATH en la máquina remota cuando ejecutó "ssh you @ remote \ $ PATH"?
Matt Curtis
7

Para bash, debe ponerse en .bashrc no .bash_profile (.bash_profile también es solo para shells de inicio de sesión).

Andrew Grimm
fuente
5

Recibí estos errores con la versión MsysGit.

Después de seguir todos los consejos que pude encontrar aquí y en otros lugares, terminé:

Instalando la versión Cygwin de Git

en el servidor (Win XP con Cygwin SSHD), esto finalmente lo solucionó.

Todavía uso el lado del cliente de la versión MsysGit

..de hecho, es la única forma en que funciona para mí, ya que obtengo errores POSIX con Cygwin Git pull del mismo servidor sshd

Sospecho que aún se necesita algo de trabajo en este lado del uso de Git ... (ssh + facilidad de extracción / inserción en Windows)

Ric Tokyo
fuente
1

Como Johan señaló muchas veces, se necesita su .bashrc:

ln -s .bash_profile .bashrc

Stefan Lundström
fuente
1

Debes agregar el

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

antes de esta línea en el .bashrc:

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

De lo contrario, no se ejecutarán todas las declaraciones de exportación ( ver aquí ).

Dennis
fuente
1

Mi caso está en Win 10 con GIT bash y no tengo un GIT en una ubicación estándar. En cambio, tengo git en / app / local / bin. Utilicé los comandos proporcionados por @Garrett pero necesito cambiar la ruta para comenzar con double /:

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

De lo contrario, el GIT agregará su ruta GIT de Windows al frente.

felixc
fuente
0

Para zsh necesita ponerlo en este archivo: ~ / .zshenv

Por ejemplo, en OS X usando el paquete git-core de MacPorts:

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

miknight
fuente
0

¡He tenido problemas para conectarme a un repositorio de Gitolite usando SSH de Windows y resultó que mi problema era PLINK! Seguía pidiéndome una contraseña, pero ssh gitolite @ [host] me devolvería la lista de repositorios.

Verifique su variable de entorno: GIT_SSH. Si está configurado en Plink, intente sin ningún valor ("set GIT_SSH =") y vea si eso funciona.

RAVolt
fuente
0

Agregue la ubicación de su git-upload-packal archivo .bashrc del usuario remoto de git.

Yeison
fuente
0

Puede ser tan simple como instalar git en el host remoto (como en mi caso).

sudo apt-get install git

O equivalente para otros sistemas de gestión de paquetes.

TrueFusion
fuente