Использование git с emacs - PullRequest
9 голосов
/ 30 мая 2009

Я пытаюсь настроить git.el. Когда я делаю git-status, я вижу буфер состояния с измененными данными, я также могу добавлять файлы, используя «a», но когда я пытаюсь зафиксировать файл, используя c запись журнала коммитов и завершение его с помощью C-c C-c дает мне

env: git: No such file or directory

ошибка и файл не зафиксирован. Я использую emacs 23 на OS X. Единственная настройка, которую я добавил в мой .emacs, это

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

потому что emacs не смог найти исполняемый файл git.

Ответы [ 3 ]

20 голосов
/ 31 мая 2009

В моем .emacs для Mac OS X у меня есть следующий код:

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

Кажется, проблема в том, что когда вы запускаете Terminal.app, он использует ваш файл инициализации оболочки для настройки всех переменных среды, но когда вы запускаете Emacs из Dock, эти переменные не устанавливаются.

P.S. Кстати, есть другие пакеты для работы с Git от Emacs - magit, DVC, egg ... О них вы можете прочитать в моей статье

5 голосов
/ 31 мая 2009

Ну, так как начало строки ошибки - env:, это говорит о том, что git.el использует программу "env", чтобы найти git и вызвать его. Просмотр источника подтверждает это, поскольку все вызовы git, по-видимому, проходят здесь:

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

Сканирование по коду показало, что в большинстве случаев Emacs вызывает git напрямую с call-process, но иногда использует команду env, особенно когда ему нужно передать переменные окружения (например, «GIT_INDEX_FILE»).

Проблема в том, что Emacs не передает exec-path в env при запуске через call-process, поэтому установка exec-path в Emacs не поможет `env 'найти git.

На самом деле есть два решения:

  1. Выясните, как получить env, чтобы узнать, где находится git. Боюсь, я не могу вам в этом помочь, поскольку я не знаю, как настроить подобные вещи на Mac, но это должна быть довольно простая модификация PATH.

  2. Взломать git.el для передачи PATH=/path/to/git в env при вызове git. Это менее чисто, но не так уж плохо от взлома, и особенно если вы сделали выбор пути в defcustom, это может быть полезно для других.

Я бы предложил начать с 1, хотя. Вы можете изменить переменные окружения для Emacs, используя:

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

И тогда попробую git.el. Хотя Emacs не передает переменную exec-path дочерним процессам, он копирует переменную окружения PATH из того, с чем он был вызван. Поскольку Emacs также вызывает git напрямую, вам также нужно установить exec-path так, как вы уже делаете.

Надеюсь, это поможет.

0 голосов
/ 24 мая 2012

Очень простой способ решить эту проблему - изменить путь exec в вашем файле .emacs

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

Это помогает мне.

...