2009-05-30 13 views
9

Sto provando a configurare git.el. Quando faccio git-status posso vedere il buffer di stato con modificato posso anche aggiungere file usando 'a' ma quando provo a commettere un file usando c scrivendo il registro di commit e finendo con Cc Cc mi dàUtilizzo di git con emacs

env: git: No such file or directory 

errore e il file non viene eseguito. Sto usando emacs 23 su OS X. L'unica personalizzazione ho aggiunto ai miei .emacs è

(setq exec-path (append exec-path '("/opt/local/bin"))) 

perché emacs non sono riusciti a trovare git eseguibile.

+0

Qual è l'output di "which git" sulla riga di comando? –

+0

/opt/local/bin/git –

risposta

20

Nel mio .emacs per Mac OS X che ho seguente codice:

(when (equal system-type 'darwin) 
    (setenv "PATH" (concat "/opt/local/bin:/usr/local/bin:" (getenv "PATH"))) 
    (push "/opt/local/bin" exec-path)) 

Sembra, che il problema è, che quando si esegue terminal.app è possibile utilizzare un file di inizializzazione della shell per impostare tutte le variabili d'ambiente , ma quando lanci Emacs dal Dock, queste variabili non vengono impostate.

P.S. A proposito: ci sono altri pacchetti per lavorare con Git di Emacs - magit, DVC, egg ...Si può leggere su di loro in my article

+0

per vedere il percorso exec: (messaggio "% S" percorso exec) -> C-x-e – yboussard

+0

C-h v exec-path è più veloce ;-) –

+0

Bel post del blog, grazie. –

5

Bene, poiché l'inizio della riga di errore è env:, suggerisce che git.el sta utilizzando il programma "env" per trovare git e chiamarlo. Guardando il sorgente di conferma dal momento che tutte le chiamate a git sembrano passare attraverso qui:

(defun git-call-process-env (buffer env &rest args) 
    "Wrapper for call-process that sets environment strings." 
    (if env 
     (apply #'call-process "env" nil buffer nil 
      (append (git-get-env-strings env) (list "git") args)) 
    (apply #'call-process "git" nil buffer nil args))) 

scansione attraverso il codice mostrato che nella maggior parte dei casi, Emacs chiama git direttamente con call-process, ma a volte usa il comando "env" , in particolare quando deve passare le variabili di ambiente (come "GIT_INDEX_FILE").

Il problema è che Emacs non passa è exec-path a env durante l'esecuzione tramite call-process, così impostando exec-path in Emacs non aiuterà `env' trovare git.

Ci sono due soluzioni:

  1. capire come raggiungere env sapere dove git è. Temo di non poterti davvero aiutare su questo, dal momento che non so come impostare quel genere di cose su un Mac, ma dovrebbe essere una modifica piuttosto semplice del PERCORSO.

  2. Hack git.el per passare PATH=/path/to/git a env quando si chiama git. Questo è meno pulito, ma non è poi così male di un trucco, e specialmente se hai fatto la scelta del percorso in un defcustom, potrebbe essere utile ad altri.

Vorrei suggerire di iniziare con 1, però. È possibile modificare le variabili di ambiente per Emacs utilizzando:

(setenv "PATH" (concat "/opt/local/bin:" (getenv "PATH"))) 

E provare git.el quindi. Mentre Emacs non passa la variabile exec-path ai processi figli, copia lungo la sua variabile d'ambiente PATH da qualunque cosa sia stata invocata. Poiché Emacs chiama direttamente git, dovrai anche impostare exec-path nel modo in cui lo sei già.

Spero che questo aiuti.

+0

git eseguibile è nel mio percorso. posso digitare git nel terminale eseguendo anche env git esegue git. ma ancora emacs non riesce a localizzarlo. –

0

Un modo molto semplice per risolvere questo problema è quello di modificare il percorso exec nel vostro .emacs

(add-to-list 'exec-path "/usr/local/git/bin/") 

Questo fa il trucco per me.