2009-05-30 17 views
9

Estoy intentando configurar git.el. Cuando hago git-status puedo ver el búfer de estado con cambios también puedo agregar archivos usando 'a' pero cuando intento enviar un archivo usando c escribiendo el registro de commit y finalizándolo con Cc Cc me daUso de git con emacs

env: git: No such file or directory 

error y el archivo no se confirma. Estoy usando emacs 23 en OS X. La única personalización he añadido a mis .emacs es

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

porque Emacs no pudieron encontrar ejecutable git.

+0

¿Cuál es la salida de 'which git' en la línea de comandos? –

+0

/opt/local/bin/git –

Respuesta

20

En mis .emacs para Mac OS X que he siguiente código:

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

Parece que el problema es que cuando se ejecuta terminal.app, utilice un archivo de inicialización de shell para configurar todas las variables de entorno , pero cuando ejecuta Emacs desde Dock, estas variables no están configuradas.

P.S. Por cierto, hay otros paquetes para trabajar con Git de Emacs: Magit, DVC, huevo ...Usted puede leer acerca de ellos en my article

+0

para ver exec-path: (mensaje "% S" exec-path) -> C-x-e – yboussard

+0

C-h v exec-path es más rápido ;-) –

+0

Buena publicación en el blog, gracias. –

5

Bueno, ya que el comienzo de la línea de error es env:, sugiere que git.el está utilizando el programa "env" para encontrar git y llamarlo. En cuanto a la fuente confirma esto, ya que todas las llamadas a Git parece que pasar por aquí:

(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))) 

exploración a través del código mostró que en la mayoría de los casos, Emacs llama git directamente con call-process, pero a veces utiliza el comando "env" , especialmente cuando necesita pasar variables de entorno (como "GIT_INDEX_FILE").

El problema es que Emacs no pasa es exec-path a env cuando se ejecuta a través de call-process, por lo que establecer exec-path en Emacs no ayudará `env' encontrar git.

En realidad, hay dos soluciones:

  1. encontrar la manera de llegar env saber dónde está git. Me temo que realmente no puedo ayudarte en esto, ya que no sé cómo configurar ese tipo de cosas en una Mac, pero debería ser una modificación bastante directa de PATH.

  2. Hack git.el para pasar PATH=/path/to/git a env al llamar a git. Esto es menos limpio, pero no es tan malo como un truco, y especialmente si hiciste la elección del camino en un defcustom, podría ser útil para otros.

Sugiero comenzar con 1, aunque. Puede cambiar las variables de entorno para Emacs usando:

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

Y probando git.el a continuación. Si bien Emacs no pasa la variable exec-path a procesos secundarios, sí copia a lo largo de su variable de entorno PATH desde cualquier fuente con la que se invocó. Dado que Emacs también llama a git directamente, también deberá configurar exec-path de la manera en que ya lo hace.

Espero que ayude.

+0

git ejecutable está en mi camino. puedo escribir git en la terminal también ejecutando env git ejecuta git. pero todavía emacs falla al ubicarlo. –

0

Una forma muy sencilla de resolver este problema es modificar la ruta ejecutivo en el fichero .emacs

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

Esto hace el truco para mí.