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?
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.
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
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
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 .
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.
Für Bash muss es in .bashrc und nicht in .bash_profile abgelegt werden (.bash_profile gilt auch nur für Login-Shells).
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
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)
Wie Johan schon oft darauf hingewiesen hat, ist die .bashrc-Datei erforderlich:
ln -s .bash_profile .bashrc
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 ).
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.
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
Fügen Sie den Ort Ihres git-upload-pack
in die .bashrc-Datei des Remote-Git-Benutzers.
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.