使用Emacs与Git

9

我正在尝试配置git.el。当我执行git-status时,我可以看到状态缓冲区中的更改,我也可以使用“a”添加文件,但是当我尝试使用c提交文件时,编写提交日志并使用C-c C-c完成会给我

env: git: No such file or directory

错误和文件未提交。我在OS X上使用emacs 23。我添加到我的.emacs文件的唯一自定义是:
(setq exec-path (append exec-path '("/opt/local/bin")) )

因为Emacs找不到Git可执行文件。

在命令行中输入'which git',会输出什么? - Norman Ramsey
3个回答

20

我在 Mac OS X 的 .emacs 中有以下代码:

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

看起来问题是,当您运行 terminal.app 时,它使用您的 shell 初始化文件来设置所有环境变量,但是当您从 Dock 启动 Emacs 时,这些变量没有设置。

P.S. 顺便说一下 - 还有其他包可以在 Emacs 中与 Git 一起使用 - magit、DVC、egg... 您可以在 我的文章中了解它们。


查看exec-path:(message“%S” exec-path)-> C-x-e - yboussard
C-h v exec-path 更快一些 ;-) - Alex Ott
1
这也可以通过一个名为exec-path-from-shell的elisp库来实现,可在Marmalade和Melpa中获取安装包。 - sanityinc

5

好的,由于错误行的开头是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使用call-process直接调用git,但是有时它会使用"env"命令,特别是当需要传递环境变量(如"GIT_INDEX_FILE")时。

问题在于,当通过call-process运行env时,Emacs没有将自己的exec-path传递给env,因此在Emacs中设置exec-path无法帮助`env'找到git。

实际上有两种解决方案:

  1. 弄清楚如何让env知道git的位置。很遗憾,我无法在此为您提供帮助,因为我不知道如何在Mac上设置这种东西,但应该是一个非常简单的路径修改。

  2. 修改git.el文件,使其在调用git时传递PATH=/path/to/git。虽然这种方法不太干净,但也不算太糟糕的hack,特别是如果你将路径选择设置为了defcustom,那么这对其他人可能也有用。

我建议先尝试1号方案。您可以使用以下命令更改Emacs的环境变量:

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

那么现在尝试使用git.el。虽然Emacs不会将变量exec-path传递给子进程,但它确实会从启动它的环境中复制PATH环境变量。由于Emacs也直接调用git,因此您还需要按照您已经设置的方式设置exec-path

希望这有所帮助。


git可执行文件已经在我的路径中。我可以在终端中输入git,同时运行env git也可以执行git。但是Emacs仍然无法找到它。 - Hamza Yerlikaya

1
解决这个问题的一个非常简单的方法是修改您的.emacs文件中的exec路径。
(add-to-list 'exec-path "/usr/local/git/bin/")

这对我来说很管用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接