Magit-Push hängt unter Windows

10

Ich verwende GNU Emacs unter Windows und kann magit-pushmeine lokalen Änderungen nicht in ein Remote-Repository übertragen. Dies geschieht bei Remote-Repositorys unabhängig davon, ob auf sie mit SSH oder HTTPS zugegriffen wird. Was muss ich tun, damit magit-pushWindows unter Windows genauso nahtlos (oder zumindest fast) funktioniert wie auf meinen Linux-Computern?

Alles was ich im *Messages*Puffer sehe ist

Running c:/Program Files (x86)/Git/bin/git.exe push -v origin master:refs/heads/master

Das gleiche zeigt sich *magit-process*mehr oder weniger im Puffer. Nichts nützlicheres. Ich kann Push über die Befehlszeile senden, aber es fragt nach dem Passwort meines SSH-Schlüssels. Könnte das das Problem sein? Ich habe versucht, den Schlüssel mit Pageant (PuTTYs Schlüsselagent) zu laden, aber das schien keinen Unterschied zu machen.

Wenn es hilfreich ist, habe ich Cygwin installiert und würde mich über eine Lösung freuen, bei der Emacs gezwungen wird, die ausführbaren Dateien von Cygwin zu verwenden.

Ryan
quelle

Antworten:

6

Das Magit-Wiki enthält jetzt eine Seite über die verschiedenen Möglichkeiten, die Magit bei Verwendung von MS Windows bietet. Überprüfen Sie auch das neue ssh-agencyPaket. Sowohl die Wiki-Seite als auch das Paket wurden von @npostavs geschrieben.

Beachten Sie auch, dass es praktisch nie Magits Schuld ist, wenn Sie nicht schieben können. Dies ist normalerweise ein Konfigurationsproblem (auch wenn Sie von der Shell aus pushen können, jedoch nicht, wenn Sie Magit verwenden).

Tarsius
quelle
6

Normalerweise besteht das Problem darin, dass Emacs unter Windows nicht auf die Kennwortabfrage von git zugreifen kann. Somit scheint es beim Push zu "hängen", wo es wirklich auf Ihr Passwort wartet. Sie können dies umgehen, indem Sie einen SSH-Schlüssel anstelle eines Benutzernamens / Passworts in Ihrem Git-Repo verwenden und den ersten Push manuell in der Shell ausführen (Git speichert Ihr SSH-Passwort nach dem ersten Push).

Bastibe
quelle
1
Die Git-Bash-Shell scheint sich nicht an mein SSH-Passwort zu erinnern, daher sehen mehr Pushs nur dasselbe.
Ryan
3

Wenn Sie dies noch nicht getan haben, würde ich die Verwendung von SSH anstelle von HTTP empfehlen, wie es mir viele bei meiner Untersuchung empfohlen haben. Trotzdem konnte ich dieses Problem mithilfe der folgenden FAQ beheben:

https://github.com/magit/magit/wiki/FAQ#windows-cannot-push-with-ssh-passphrase

Die fehlende Komponente (aus Githubs Git Bash .bashrc-Skript) besteht darin, dass der Start des SSH-Agenten für Schnittstellen wie die Windows-Befehlszeile oder Emacs nicht möglich ist. Wenn Sie die obigen Schritte ausführen, wird ssh-agent beim Start von emacs gestartet. Beachten Sie, dass Sie Git Bash starten und Ihre SSH-Passphrase eingeben müssen, wenn Sie Ihren Computer starten / neu starten.

PatternMatching
quelle
2

Auch ich habe dieses Verhalten eine Weile erlebt und bin bis heute nicht dazu gekommen, es wirklich zu beheben. Ich habe dazu Folgendes in meine Init-Datei eingefügt:

(setenv "GIT_SSH" "C:/Path/to/PuTTY/plink.exe")

Ich habe dies auch getestet, indem ich ein sauberes Emacs ( emacs -Q) geöffnet magit, diese Zeile geladen und ausgewertet habe, und es hat funktioniert.

Dies funktioniert mit Pageant, so dass Sie sich nicht damit anlegen müssen ssh-agent.

Scott Weldon
quelle
1
Für mich war dies die beste Lösung für jemanden, der Command-Line-Git und die PuTTY-bezogenen ausführbaren Dateien wie pageant installiert hat.
Tom Purl
1

Wenn Sie Cygwin bereits installiert haben, können Sie Ihre Schlüssel mithilfe von Schlüsselbund und Schlüsselbundumgebung verwalten.

Verwenden Sie dann die Shell Ihrer Wahl, um den Schlüsselbund zu starten

(require 'keychain-environment)
(keychain-refresh-environment)

um sicherzustellen, dass die Schlüssel in Emacs geladen werden.

Jonathan Leech-Pepin
quelle
Hmmm. Ich habe es versucht und nichts hat sich wirklich geändert. Der magit-pushBefehl hing wie immer.
Ryan
1

Ich habe nie herausgefunden, wie ich das mit MSYS Git und Emacs beheben kann, aber hier ist eine nahtlose Problemumgehung.

Fügen Sie Git Credential Winstore zu Ihrem $ PATH hinzu. Git-Credential-Winstore verwendet den Windows-Schlüsselbund, um Ihre Kennwörter für Sie zu verwalten, und Magit wird gerne auf Remote-Repositorys übertragen.

Stellen Sie in Ihrer .gitconfigDatei Folgendes ein:

[credential]
        helper = "winstore"

Dies funktioniert, weil in den Git Credential Docs angegeben ist, dass "wenn der Hilfsname kein absoluter Pfad ist, der String git credential- vorangestellt wird". Ich bevorzuge diesen Ansatz.

Alternativ können Sie einfach git-credential-winstore.exe ausführen und es wird sich selbst in Ihrem AppData-Ordner installieren und Ihre .gitconfigDatei mit einem fest codierten Pfad zu ihrem Speicherort ausfüllen . Nach dem Ausführen sehen Sie folgendermaßen aus .gitconfig:

[credential]
        helper = !"c:\\Users\Joe\\\AppData\\Roaming\\GitCredStore\\git-credential-winstore.exe"

Das Ausrufezeichen weist Git an, die Zeichenfolge als absoluten Pfad zu behandeln.

Joe
quelle
0

Wie @bastibe zeigte, wartet Magit wahrscheinlich auf eine Passworteingabe und bleibt einfach dran ...

Ich erinnere mich an Folgendes, als ich gezwungen war, Windows zu verwenden :-). Ich erinnere mich nicht an den genauen Befehlsnamen, stelle auch sicher, dass der exec-pathenthält c:/Program Files (x86)/Git/bin/.

(setenv "GIT_ASKPASS" "git-gui--askpass")
Rimero
quelle
0

Ich habe runemacs.exe von der Git-Shell ausgeführt. Jetzt funktioniert der Git Push von Magit.

Majid alDosari
quelle
1
Dies scheint in keiner Weise mit der Frage zu tun zu haben. Wenn Sie die Frage beantworten runemacswollten , bearbeiten Sie bitte Ihre Antwort, die erklärt, wie das Laufen irgendwie mit Magit zusammenhängt.
Gilles 'SO - hör auf böse zu sein'
nett. Ich werde zum Löschen markiert, bevor ich überhaupt die Möglichkeit habe, es besser zu erklären. Es ist eine Antwort (Lösung) auf das Problem.
Majid alDosari
1
Ich denke nicht, dass die Antwort eine Abwertung verdient. Es kann jedoch besser sein, den Grund zu erklären, warum es funktioniert hat (wenn die Git-Shell unter Windows ausgeführt wird, werden einige Umgebungsvariablen in Emacs unterschiedlich initialisiert, wodurch Magit auch in der Lage ist, mit Git so zu interagieren, wie es es versteht). Vielleicht hat die Art und Weise, wie OP versucht hat, Magit-Befehle auszuführen, mit Git auf eine Weise interagiert, die Magit nicht erwartet hatte.
wvxvw
1
Dies ist eine Antwort. Der Benutzer weiß möglicherweise nicht, warum es einen Unterschied gemacht hat, aber er sagt, was in seinem Fall funktioniert hat.
Malabarba