【问题标题】:Using git with emacs将 git 与 emacs 一起使用
【发布时间】:2010-10-30 03:34:07
【问题描述】:

我正在尝试配置 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'的输出是什么?

标签: git macos version-control emacs


【解决方案1】:

在我的 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 时,这些变量并没有设置。

附:顺便说一句 - Emacs 中还有其他可以与 Git 配合使用的包 - magit、DVC、egg... 你可以在 my article

中了解它们

【讨论】:

  • 查看 exec-path : (message "%S" exec-path) -> C-x-e
  • C-h v exec-path 更快 ;-)
  • 这也可以通过一个名为 exec-path-from-shell 的 elisp 库来实现,并且可以在 Marmalade 和 Melpa 中找到可安装的软件包。
【解决方案2】:

好吧,由于错误行的开头是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”)。

问题是 Emacs 在通过 call-process 运行它时不会将它的 exec-path 传递给 env,因此在 Emacs 中设置 exec-path 不会帮助 `env' 找到 git。

其实有两种解决方案:

  1. 弄清楚如何让env 知道 git 在哪里。恐怕我不能真正帮助你,因为我不知道如何在 Mac 上设置这种东西,但它应该是对 PATH 的相当简单的修改。

    李>
  2. 在调用 git 时破解 git.el 以将 PATH=/path/to/git 传递给 env。这不太干净,但它并不是那么糟糕,尤其是如果您选择了进入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 仍然无法找到它。
【解决方案3】:

解决此问题的一个非常简单的方法是修改 .emacs 文件中的 exec 路径

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

这对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2015-08-31
    • 2014-03-02
    相关资源
    最近更新 更多