2009-05-30 16 views
9

Próbuję skonfigurować git.el. Kiedy robię git-status, widzę bufor stanu ze zmienionym i mogę również dodawać pliki przy użyciu "a", ale kiedy próbuję zatwierdzić plik przy użyciu c , zapisanie dziennika zatwierdzeń i ukończenie go przy pomocy Cc Cc daje miUżywanie gita z emacsem

env: git: No such file or directory 

błąd i plik nie jest zatwierdzony. Używam emacs 23 na OS X. tylko dostosowanie dodałem do moich .emacs jest

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

bo emacs nie udało się znaleźć git wykonywalny.

+0

Jaki jest wynik polecenia "który git" w wierszu poleceń? –

+0

/opt/local/bin/git –

Odpowiedz

20

W moim .emacs dla Mac OS X, mam następujący kod:

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

Wydaje się, że problem jest, że po uruchomieniu Terminal.app używać pliku inicjalizacji powłoki skonfigurować wszystkie zmienne środowiskowe , ale kiedy uruchamiasz Emacs z Dock, te zmienne nie są ustawione.

P.S. Przy okazji - są jeszcze inne pakiety do pracy z Git z Emacs - magit, DVC, egg ...Można o nich poczytać w my article

+0

aby zobaczyć exec-path: (wiadomość "% S" exec-path) -> C-x-e – yboussard

+0

C-h v exec-ścieżka jest szybsza ;-) –

+0

Fajny blog, dziękuję. –

5

Cóż, ponieważ początek linii błędu to env:, sugeruje, że git.el używa programu "env", aby znaleźć git i wywołać go. Patrząc na źródło potwierdza to od wszystkich wywołań git pojawiają przejść tutaj:

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

Skanowanie za pomocą kodu wykazały, że w większości przypadków, Emacs nazywa git bezpośrednio z call-process, ale czasami wykorzystuje komendę „env” , szczególnie gdy musi przekazać zmienne środowiskowe (np. "GIT_INDEX_FILE").

Problemem jest to, że Emacs nie przechodzi to exec-path do env podczas uruchamiania go poprzez call-process, więc ustawienie exec-path w Emacs nie pomoże `env” znaleźć git.

Są naprawdę dwa rozwiązania:

  1. dowiedzieć się, jak dostać env wiedzieć, gdzie jest git. Obawiam się, że nie mogę ci pomóc w tej sprawie, ponieważ nie wiem, jak skonfigurować takie rzeczy na Macu, ale powinna to być dość prosta modyfikacja PATH.

  2. Hack git.el przekazuje PATH=/path/to/git do env podczas wywoływania git. Jest to mniej czyste, ale nie jest tak źle z powodu hackowania, a zwłaszcza jeśli wybrałeś ścieżkę do defcustom, może to być przydatne dla innych.

Proponuję jednak zacząć od 1. Możesz zmienić zmienne środowiskowe dla Emacsa, używając:

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

I następnie próbując git.el. Chociaż Emacs nie przekazuje zmiennej procesom potomnym do zmiennej exec-path, kopiuje ona wraz ze zmienną środowiskową PATH ze wszystkich elementów, z których została wywołana. Ponieważ Emacs również bezpośrednio wywołuje git, musisz także ustawić exec-path w taki sposób, w jaki już jesteś.

Nadzieję, że pomaga.

+0

Plik wykonywalny git jest na mojej ścieżce. mogę wpisać git w terminalu również działający env git wykonuje git. ale nadal emacs nie może go zlokalizować. –

0

bardzo prosty sposób na rozwiązanie tego problemu jest zmodyfikowanie exec ścieżkę w pliku .emacs

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

To załatwia sprawę dla mnie.

Powiązane problemy