it-swarm.com.de

git-upload-pack: Befehl nicht gefunden, wenn fernes Git-Repo geklont wird

Ich habe git verwendet, um zwei Kopien meines Projekts synchron zu halten, eine ist meine lokale Box, die andere der Testserver. Dies ist ein Problem, das auftritt, wenn ich mich mit ssh bei unserem Remote-Entwicklungsserver anmelde.

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.

(Die Dateinamen wurden geändert, um die Schuldigen zu schützen ...!)

Auf beiden Boxen wird Solaris 10 AMD ausgeführt. Ich habe ein bisschen gegraben, wenn ich --upload-pack=$(which git-upload-pack) hinzufüge, funktioniert der Befehl (und beweist, dass $PATH Den Pfad zu 'git-upload-pack' gemäß RTFM Lösung), aber das ist wirklich ärgerlich, und 'git Push' funktioniert nicht, weil ich nicht glaube, dass es eine --unpack= - Option gibt.

Übrigens funktionieren alle git-Befehle in meiner lokalen Box einwandfrei. Es handelt sich um dieselbe Version der Software (1.5.4.2), die auf demselben NFS-Mount unter /usr/local/bin Installiert ist.

Kann jemand helfen?

169

Vergewissern Sie sich, dass sich git-upload-pack Auf dem Pfad einer Shell ohne Anmeldung befindet. (Auf meinem Computer ist es in /usr/bin).

Versuchen Sie Folgendes, um zu sehen, wie Ihr Pfad auf dem Remotecomputer von einer Shell ohne Anmeldung aus aussieht:

ssh [email protected] echo \$PATH

(Das funktioniert in Bash, Zsh und tcsh und wahrscheinlich auch in anderen Shells.)

Wenn der zurückgegebene Pfad nicht das Verzeichnis mit git-upload-pack Enthält, müssen Sie ihn korrigieren, indem Sie .bashrc (Für Bash), .zshenv (Für Zsh) festlegen ), .cshrc (Für tcsh) oder gleichwertig für Ihre Shell.

Sie müssen diese Änderung auf dem Remote-Computer vornehmen.

Wenn Sie nicht sicher sind, welchen Pfad Sie zu Ihrem entfernten PATH hinzufügen müssen, können Sie ihn mit diesem Befehl finden (Sie müssen dies auf dem entfernten Rechner ausführen):

which git-upload-pack

Auf meinem Computer, auf dem /usr/bin/git-upload-pack Gedruckt wird. In diesem Fall ist /usr/bin Der Pfad, den Sie in Ihrer nicht angemeldeten Remote-Shell PATH angeben müssen.

169
Matt Curtis

Sie können auch die Option "-u" verwenden, um den Pfad anzugeben. Ich finde dies hilfreich auf Computern, auf denen mein .bashrc-Code in nicht interaktiven Sitzungen nicht verwendet wird. Beispielsweise,

git clone -u /home/you/bin/git-upload-pack [email protected]:code
67
Brian Hawkins

Aufbauend auf Brians Antwort kann der Upload-Pack-Pfad dauerhaft festgelegt werden, indem die folgenden Befehle nach dem Klonen ausgeführt werden, wodurch die Notwendigkeit von --upload-pack Für nachfolgende Pull/Fetch-Anforderungen entfällt. In ähnlicher Weise wird durch das Festlegen von Receive-Pack die Notwendigkeit von --receive-pack Für Push-Anforderungen beseitigt.

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

Diese beiden Befehle entsprechen dem Hinzufügen der folgenden Zeilen zu .git/config Eines Repos.

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

Häufige Benutzer von clone -u Sind möglicherweise an den folgenden Aliasen interessiert. myclone sollte selbsterklärend sein. myfetch/mypull/mypush kann auf Repos verwendet werden, deren Konfiguration nicht wie oben beschrieben geändert wurde, indem git Push durch git mypush usw. ersetzt wird.

[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

Ich habe dieses Update gefunden und (erfolgreich) verwendet:

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

Vielen Dank an Paul Johnston .

30
Andy

Mac OS X und einige andere Unixe haben zumindest aus Sicherheitsgründen den Benutzerpfad in sshd kompiliert, damit diejenigen von uns, die git als/usr/local/git/{bin, lib, ...} installieren, als git Probleme bekommen können ausführbare Dateien befinden sich nicht im vorkompilierten Pfad. Um dies zu überschreiben, bearbeite ich lieber meine/etc/sshd_config-Änderung:

#PermitUserEnvironment no

zu

PermitUserEnvironment yes

und erstellen Sie dann nach Bedarf ~/.ssh/environment-Dateien. Meine Git-Benutzer haben Folgendes in ihrer ~/.ssh/environment-Datei:

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

Hinweis: Beim Lesen der Datei ~/.ssh/environment tritt keine Variablenerweiterung auf.

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

wird nicht funktionieren.

12
tom

Für Bash muss es in .bashrc und nicht in .bash_profile abgelegt werden (.bash_profile gilt auch nur für Login-Shells).

7
Johan Almqvist

Matts Lösung funktionierte unter OS X nicht, Pauls jedoch.

Die Kurzversion von Pauls Link lautet:

Erstellt /usr/local/bin/ssh_session Mit folgendem Text:

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

Ausführen:

chmod +x /usr/local/bin/ssh_session

Fügen Sie /etc/sshd_config Folgendes hinzu:

ForceCommand/usr/local/bin/ssh_session

6
Skeletron

Ich habe diese Fehler mit der MsysGit-Version erhalten.

Nachdem ich alle Ratschläge befolgt hatte, die ich hier und anderswo finden konnte, kam ich zu folgendem Ergebnis:

installieren der Cygwin-Version von Git

auf dem Server (Win XP mit Cygwin SSHD)) wurde dies endgültig behoben.

Ich benutze immer noch die MsysGit-Version auf der Clientseite

..in der Tat, es ist die einzige Möglichkeit, wie es für mich funktioniert, da ich POSIX-Fehler mit dem Cygwin Git-Pull von demselben sshd-Server bekomme

Ich vermute, dass diese Seite von Git noch etwas Arbeit benötigt. (Ssh + einfaches Ziehen/Schieben in Windows)

5
Ric Tokyo

Wie Johan schon oft darauf hingewiesen hat, ist die .bashrc-Datei erforderlich:

ln -s .bash_profile .bashrc

1

Sie müssen die hinzufügen

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

vor dieser Zeile in der .bashrc:

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

Andernfalls werden nicht alle export-Anweisungen ausgeführt ( siehe hier ).

1
Dennis

Ich hatte Probleme mit der Verbindung zu einem Gitolite-Repo unter Verwendung von SSH unter Windows und es stellte sich heraus, dass mein Problem PLINK war! Es fragte mich immer wieder nach einem Passwort, aber der SSH-Gitolite @ [Host] würde die Repo-Liste in Ordnung zurückgeben.

Überprüfen Sie Ihre Umgebungsvariable: GIT_SSH. Wenn Plink eingestellt ist, versuchen Sie es ohne Wert ("set GIT_SSH =") und prüfen Sie, ob dies funktioniert.

0
RAVolt

Für zsh müssen Sie es in diese Datei einfügen: ~/.zshenv

Zum Beispiel unter OS X mit dem Git-Core-Paket von MacPorts:

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

0
miknight

Fügen Sie den Ort Ihres git-upload-pack in die .bashrc-Datei des Remote-Git-Benutzers.

0
Yeison

Mein Fall ist auf Win 10 mit GIT-Bash und ich habe keine GIT unter Standardspeicherort. Stattdessen habe ich git unter/app/local/bin. Ich habe die Befehle von @Garrett verwendet, muss aber den Pfad ändern, um mit double/zu beginnen:

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

Andernfalls fügt die GIT Ihren Windows-GIT-Pfad voran.

0
felixc