magit-push se bloque sur Windows


10

J'utilise GNU Emacs sur Windows et je ne peux pas utiliser magit-pushpour pousser mes modifications locales vers un référentiel distant. Cela se produit avec les référentiels distants, qu'ils soient accessibles via SSH ou HTTPS. Que dois-je faire pour que le magit-pushtravail sur Windows soit aussi transparent (ou du moins presque) que sur mes machines Linux?

Tout ce que je vois dans le *Messages*tampon est

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

La même chose se voit *magit-process*plus ou moins dans le tampon. Rien de plus utile. Je suis capable de pousser depuis la ligne de commande, mais il demande le mot de passe de ma clé ssh. Serait-ce le problème? J'ai essayé de charger la clé avec Pageant (l'agent clé de PuTTY), mais cela ne semble pas faire de différence.

Si cela est utile, j'ai installé Cygwin et serais heureux avec une solution qui impliquait de forcer Emacs à utiliser les exécutables de Cygwin.

Réponses:


6

Le wiki de Magit propose désormais une page sur les différentes manières de pousser depuis Magit lors de l'utilisation de MS Windows. Vérifiez également le nouveau ssh-agencypackage. La page wiki et le package ont été écrits par @npostavs.

Notez également que ce n'est pratiquement jamais la faute de Magit si vous ne pouvez pas pousser. C'est généralement un problème de configuration (même si vous pouvez pousser depuis le shell mais pas lorsque vous utilisez Magit).


6

Habituellement, le problème est qu'Emacs ne peut pas accéder à l'invite de mot de passe de git sous Windows. Ainsi, il semble "se bloquer" sur push, où il attend vraiment votre mot de passe. Vous pouvez contourner cela en utilisant une clé ssh au lieu d'un nom d'utilisateur / mot de passe dans votre dépôt git, et en effectuant le premier push manuellement dans le shell (git se souviendra de votre mot de passe ssh après le premier push).


1
Le shell bash de Git ne semble pas se souvenir de mon mot de passe ssh, donc plus de push ne voient que la même chose.
Ryan

3

Si vous ne l'avez pas déjà fait, je recommanderais d'utiliser SSH au lieu de HTTP comme beaucoup me l'ont recommandé lors de mon enquête à ce sujet. Cela dit, j'ai pu résoudre ce problème en utilisant la FAQ ci-dessous:

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

Le composant manquant (du script Git Bash .bashrc de Github) est qu'il ne gère pas le démarrage de ssh-agent pour les interfaces telles que la ligne de commande Windows ou emacs. Suivre les étapes ci-dessus lance ssh-agent au démarrage d'emacs. Remarque, vous devrez démarrer Git Bash et saisir votre phrase secrète SSH lors du démarrage / redémarrage de votre machine.


2

Moi aussi, j'ai connu ce comportement pendant un certain temps, et jusqu'à aujourd'hui, je n'ai pas vraiment essayé de le réparer. Je l'ai fait en plaçant ce qui suit dans mon fichier init:

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

J'ai également testé cela en ouvrant un Emacs ( emacs -Q) propre , en chargeant magitet en évaluant cette ligne, et cela a fonctionné.

Cela fonctionne avec Pageant, donc il n'est pas nécessaire de jouer avec ssh-agent.


1
Pour moi, c'était la meilleure solution pour quelqu'un qui a installé git en ligne de commande et les exécutables liés à PuTTY comme pageant.
Tom Purl

1

Si Cygwin est déjà installé, vous pouvez utiliser le trousseau et l' environnement de trousseau pour gérer vos clés.

Utilisez le shell de votre choix pour lancer le trousseau, puis

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

pour vous assurer que les clés sont chargées dans Emacs.


Hmmm. J'ai essayé et rien n'a vraiment changé. La magit-pushcommande s'est bloquée comme elle le fait toujours.
Ryan

1

Je n'ai jamais compris comment résoudre ce problème avec seulement MSYS Git et Emacs, mais voici une solution de contournement transparente.

Ajoutez Git Credential Winstore à votre $ PATH. Git-Credential-Winstore utilisera le trousseau Windows pour gérer vos mots de passe pour vous et Magit se fera un plaisir de pousser vers des référentiels distants.

Dans votre .gitconfigfichier, définissez les éléments suivants:

[credential]
        helper = "winstore"

Cela fonctionne parce que les documents d'informations d'identification Git indiquent que "si le nom de l'assistant n'est pas un chemin absolu, la chaîne d'informations d'identification git est ajoutée". Je préfère cette approche.

Alternativement, vous pouvez simplement exécuter git-credential-winstore.exe et il s'installera dans votre dossier AppData et remplira votre .gitconfigfichier avec un chemin codé en dur vers son emplacement. Après l'avoir exécuté, votre .gitconfigressemblera à ceci:

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

Le point d'exclamation demande à Git de traiter la chaîne comme un chemin absolu.


0

Comme l'a souligné @bastibe, Magit attend probablement une entrée de mot de passe et se bloque juste là ...

Je me souviens du fonctionnement suivant lorsque j'ai été obligé d'utiliser Windows :-). Je ne me souviens pas du nom exact de la commande, assurez-vous également que le exec-pathcontient c:/Program Files (x86)/Git/bin/.

(setenv "GIT_ASKPASS" "git-gui--askpass")

0

J'ai exécuté runemacs.exe à partir du shell git. Maintenant, le git push de magit fonctionne.


1
Cela ne semble aucunement lié à la question. Si vous vouliez répondre à la question, veuillez modifier votre réponse qui explique en quoi la course à pied runemacsest liée à magit.
Gilles 'SO- arrête d'être méchant'

agréable. je suis marqué pour suppression avant même d'avoir une chance de mieux expliquer? c'est une réponse (solution) au problème.
Majid alDosari

1
Je ne pense pas que la réponse mérite d'être rejetée. Mais il peut être préférable d'expliquer la raison pour laquelle cela a fonctionné (si vous exécutez à partir du shell Git sur Windows, certaines variables d'environnement seront initialisées différemment dans Emacs, cela permettra également à Magit d'être en mesure d'interagir avec Git de la manière qu'il comprend). Peut-être que la façon dont OP a essayé d'exécuter les commandes Magit a interagi avec Git d'une manière que Magit ne s'attendait pas.
wvxvw

1
Ceci est une réponse. L'utilisateur ne sait peut-être pas pourquoi cela a fait une différence, mais il dit ce qui a fonctionné dans son cas.
Malabarba
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.