【问题标题】:Cannot open load file error when pulling .emacs.d from version control using ELPA使用 ELPA 从版本控制中提取 .emacs.d 时无法打开加载文件错误
【发布时间】:2013-10-07 18:56:51
【问题描述】:

我已经到处寻找答案,但我似乎无法弄清楚。我在 GNU Emacs 24.3.1 中使用 package.el (elpa) 安装了 auctex。我正在尝试使用 Github 进行版本控制,并且我将所有自定义设置和首选项保存在我的 .emacs.d/init.el 中(根本不使用 .emacs)。我试图让所有包在多台机器之间保持同步,只要我能在任何时候去一台新机器上拉我的.emacs.d 并且一切正常。

我使用git add -A 提交了整个 .emacs.d,然后提交并推送(来自 OS X)。然后我将存储库拉到另一台机器(Windows 7 机器)。加载时出现以下错误

Warning (initialization): An error occurred while loading `c:/Users/user/.emacs.d/init.el':

File error: Cannot open load file, c:/Users/user/.emacs.d/elpa/auctex-11.87.1/auctex-autoloads

我已尝试在我的 init.el 中包含以下内容

(setq package-enable-at-startup nil)
(package-initialize)
(require 'auctex)

但没有任何运气。有谁知道可能导致问题的原因?

编辑:我刚刚意识到,当我提交到 GitHub 时,它并没有添加我期望的所有文件,包括没有添加 auctex-autoloads.el。我不确定为什么会这样,但我认为这与我如何添加要提交到 GitHub 的文件有关。任何帮助将不胜感激!

编辑 2:我尝试将选项 --force 添加到 git add -a --force 并且现在一切正常。我还在学习 git,所以我认为这是一个简单的错误。我仍然不完全确定为什么它会自动排除某些文件而不是其他文件,但我会尝试弄清楚。

谢谢!

【问题讨论】:

  • Emacs 在 Windows 和 Mac OS 中的版本是一样的吗?
  • 你在某处有.gitignore 文件吗?还要检查.git/info/exclude。另外,查看您尝试添加的文件是否不是符号链接。 Git 不知道如何在 Windows 上创建符号链接。如果您从不添加所有文件的目录中显示来自 $ls -la 的输出,将会有所帮助。
  • 您可能希望完全避免提交由 package.el 安装的文件。我只保留我想要的软件包列表和一些安装缺失软件包的代码。看到这个答案:stackoverflow.com/a/14838150/245173.

标签: git emacs elpa


【解决方案1】:

当您使用git add -A 时,Git 会自动从提交中排除某些文件,尽管我不确定为什么。我需要包含--force 选项(即git add -A --force),然后它将所有文件正确添加到存储库中。原来我错过了需要的auctex-autoloads.el

此外,我随后添加了我自己的 .gitignore 和一些我不想添加到存储库中的目录,似乎这已经覆盖了导致它排除自动加载文件和带有扩展名的文件的任何忽略规则.elc.所以,现在我只需要git add -A 将所有文件添加到存储库。

感谢大家观看!

【讨论】:

    【解决方案2】:

    您可能会考虑的另一个策略是将您的 initi 文件保存在 git 中,并包含一个方法,该方法会在必要时自动从 elpa 下载已安装的软件包到新机器上。这避免了将所有包内容保留在存储库中的需要,但它确实要求每台机器都可以访问 elpa 站点。

    我将包配置保存在单独的配置中,然后加载它 从我的初始化文件中。

    这是我用来重新加载丢失的包的方法:

    ;; emacs package manager.
    (require 'package)
    (add-to-list 'package-archives
                 '("melpa" . "http://melpa.org/packages/")
                 '("org" . "http://orgmode.org/elpa/"))
    (package-initialize)
    
    ;; Create a list of the packages currently installed. You can use the
    ;; contents of the directory in which they are stored (usually
    ;; ~/.emacs.d/elpa). Ensure you only use the package name, and not any
    ;; version information.
    
    ;; a good way to get a formatted list of the packages loaded is with the
    ;; following shell command:
    ;; ls ~/.emacs.d/elpa | sed -e s/-[0-9.].*//
    (defvar cm/packages nil
      "A list of elpa packages that should be available on startup")
    (setq cm/packages                                                  
          '(
            auto-complete
            bm
            browse-url-dwim
            bs-ext
            color-moccur
            color-theme-sanityinc-solarized
            csv-mode
            dash
            deferred
            diminish
            dired-hacks-utils
            elisp-slime-nav
            epl
            esh-help
            git-commit-mode
            git-gutter+
            git-rebase-mode
            git-timemachine
            hc-zenburn-theme
            highlight-symbol
            hl-sexp
            ht
            htmlize
            igrep
            js2-mode
            list-utils
            magit
            markdown-mode
            names
            org
            ox-pandoc
            pandoc-mode
            paredit
            popup
            projectile
            request
            request-deferred
            s
            smartparens
            sqlplus
            starter-kit-eshell
            string-utils
            w3m
            windata
            ))
    
    ;; cycle through the package list and prompt to install any missing from
    ;; the list
    
    (defvar missing-pkgs '())
    
    (defun cm-package-refresh ()
      (interactive)
      (setf missing-pkgs nil)
      (dolist (pkg cm/packages)
        (if (not (package-installed-p pkg))
            (progn
              (add-to-list 'missing-pkgs pkg)
              (setq cm-message "Done"))
          (setq cm-message "Nothing missing")))
      ;; for any missing packages, ask to load them all
      (if (and (> (length missing-pkgs) 0)
               (y-or-n-p-with-timeout
                (format "%s %s " "install missing packages:" missing-pkgs) 4 nil))
           (dolist (mpkg missing-pkgs)
            (package-install mpkg)))
      (message "%s" cm-message))
    
    ;; now check for missing packages
    (if (y-or-n-p-with-timeout "Check packages? " 4 nil)
        (cm-package-refresh))
    
    
    (provide 'emacs-package)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 2016-01-23
      相关资源
      最近更新 更多