将.emacs和.emacs.d保留在版本控制中时,我应该/应该做什么?


65

像许多人一样,我通过版本控制存储库(在我的情况下为Bitbucket上的Mercural,私有)来管理许多dotfile。在设置新机器或在不同机器之间传播配置时,这非常方便。

所以自然地,我将我的.emacs和添加.emacs.d到了此设置。

然后,我安装了一些软件包,并最终将其添加*.elc.hgignore,就像我*.pyc从Python存储库中删除文件一样。

还有其他我不应该跟踪的事情,例如,生成的文件是特定于环境的,并且在克隆到另一个平台时不会有用/正确吗?(我在台式机上使用Linux和OS X,在服务器上使用FreeBSD。)

是否有任何通常用来使这种共享变得更有价值的设置技巧?通过我的Shell文件设置,我仍在寻找例如跨分支挑选单个文件的好方法。


仅供参考,尽管有以下说明,但如果您在所有计算机上使用相同的emacs版本,则同步Elpa目录是完全可以的。
马拉巴巴2014年

Answers:


36

我将我的Emacs配置存储在Github中,因为我使用两台不同的计算机,一台在工作,一台在家里。

以下是有关我未放入源代码管理中的内容的列表:

环境指定的设置。

例如,我的Emacs在启动时在不同的计算机上打开了不同的组织文件。您不想将这些设置提交到源代码管理中。

我曾经(require 'local nil t)加载这些设置,但从未提交过local.el

由程序包管理器管理的程序包

当程序包由程序包管理器管理时,建议不要将这些程序包放入源代码管理中。因为:

  1. 您必须在每次更新后提交。
  2. 您可能会错过存储在其他位置的重要文件,从而使您无法在其他计算机之间正确同步。

建议不要提交包管理器认可的机制,而不是提交包。

例如,我使用Cask管理我的第3个软件包,因此我只提交cask文件,该文件包含我想要的指定软件包。

当我package.el以前使用时,我的配置将检查软件包是否已安装/需要更新,因此不提交任何软件包。

但是,有些软件包存储库中不存在某些软件包,在这种情况下,我会将其提交到源代码管理中,例如in中site-lisp

包生成的所有文件

例如,所有自动保存,备份文件trampeshellrecentf,甚至custom.el。我将这些文件放入~/.emacs/.gen,因此可以忽略此目录。

经常更改但需要同步的文件

例如,所使用的个人词典文件,所使用的aspell文件数据库elfeed,在这种情况下,我使用Dropbox在不同计算机之间同步它。所以我不会忘记承诺。


2
只要您仅使用支持Cask的机器(最不支持Windows),就可以使用Cask。
T. Verron 2014年

有些人可能会在每次更新后提交软件包,如果没有,我建议不要存储整个软件包。让程序包管理器完成这项工作。
林吉angi

@ T.Verron我能够使Cask在Cygwin上工作,但这给我带来了一些麻烦。顺便说一句,我现在正在使用Emacs Prelude,并且发现该prelude-require-packages功能可以用作穷人的木桶(具有与Windows一起使用的优势)。
rsenna 2014年

cygwin酒桶可以与w32 emacs一起使用吗?当涉及到宏来模拟这种行为时,emacs.stackexchange.com / a / 410/184package-install提到的内置函数也可能会有所帮助。
T. Verron 2014年

2
@JorgeArayaNavarro如果它们在不同的机器上是相同的,则提交它是完全可以的。:),但不是我的情况。而且,由于它会自动进行编辑,所以有时我忘记提交,这就是为什么我不将其custom.el置于源代码管理中的原因。
林吉angi

8

只要确保存储库中没有生成的东西(例如@ rangi-lin注释),并且,如果要与他人共享点文件,就不要使用任何相关的安全性东西(例如密码和API密钥)。对于以后,我将自定义内容拆分为一个单独的文件,其内容如下:

(setq custom-file (concat dotfiles-dir "custom.el"))
(load custom-file 'noerror)

有时候,我会将“安全”自定义项移到setq上面的代码段之前的一个大声明中。

我的.gitignore文件如下所示:

/.org-id-locations
/ac-comphist.dat
/auto-save-list
/custom.el
/elpa/*
/image-dired/
/oauth2.plstore
/session.*
/tramp
/url/
/var/
*.elc

8

tl; dr

  • .emacs.d/init.el代替.emacs
  • 把你.gitignore列入白名单
  • 使用包管理器

.emacs.d / init.el

我使用.emacs.d/init.el代替,.emacs因为此设置允许我将其.emacs.d置于git下。有了它们~/.emacs,您可以创建指向git存储库的符号链接,或者在您的主​​目录中具有git repo。如果您使用.emacs.d,那么一切都会解决。

.gitignore

我的.gitignore是白名单,而不是默认的黑名单。

*

!.gitignore
!init.el

通过此配置,您可以专注于真正需要的内容,而不是不需要的内容。 .emacs.d与源代码存储库不同,这意味着不仅您的代码驻留在其中,而且所有其他自动生成的或临时文件也在其中。您真的不知道会发生什么。因此,IMO是“ 默认情况下忽略所有并添加您关心的文件 ”是更好的策略。

顺便说一句,我将大部分配置保留在中init.el,而不是使用多文件方案。原因是大文件允许我a)使用标准工具,例如occurisearch-forward转到我想要的配置,b)使用outshine使我的init.el org-cycle-able可用的文件,c)不会一直更改我.gitignore的文件。

包装经理

除非您有特殊需要在所有系统上同步Emacs版本和/或Packages版本,否则不要将Packages放在git下。 Package.el很好 use-package还可以 木桶很好。选择您的程序包管理器,仅提交您的配置文件,而不提交程序包本身。

即。我可以想到的特殊需求之一是拥有两个系统,一个开发和部署,并且它们必须具有完全相同的Emacs配置。


init.el只要文件不会太大,就可以将所有内容保存在一个文件中。Emacs不擅长处理大文件,过一会儿,当编辑大文件时,Emacs才开始抓取init.el。将配置拆分为多个文件的另一个优点是,它们可以更好地与git一起使用,在某些情况下,可以将对单个文件的更改视为合并冲突,但如果更改位于单独的文件中,则不是这样。最后,注释掉单个需求比初始化文件中的大部分要容易得多。
izkon

6

我的.hgignore文件中包含以下内容

  • emacs服务器文件
  • 最近文件:一台机器上的文件路径在另一台机器上没有意义
  • elpa / melpa目录:使用init文件自动安装所需的软件包并保存拉/推时间。

如果要与其他人共享init,则可以考虑删除所有历史文件,例如savehist模式创建的文件。除此之外,我认为对此没有任何特殊的技巧。您在版本控制代码项目中遵循的所有准则在这里也都可以正常工作。


3

随着时间的推移,包中添加了很多东西,~/.emacs最后我将包中的内容逐一添加.gitignore。我也有一个private.el包含密码,我不跟踪的机器特定代码等。

这就是我现在所拥有的。

# Gitignore file

# Remove backup files
*#
*.
*.elc
*~
.#*

# Emacs packages
elpa/
var/

#  Emacs tmp files & Misc
/.mc-lists.el
/.DS_Store
/.emacs.desktop
/.emacs.desktop.lock
/.watsonresults
/ac-comphist.dat
/auto-save-list
/eshell/history
/eshell/lastdir
/newsticker/feeds/
/snippets/
/tramp
/url/cookies
/.python-environments/
/ido.last
/places
/private.el
/games/
/bookmarks
/projectile-bookmarks.eld
/projectile.cache

1

这取决于您使用的软件包/功能,因此可能会比较棘手。例如,如果您使用Dired-immage,则在Vamsi提到的文件旁边,该文件还会在其中创建目录以缓存缩略图。您可能也想忽略.elc文件。


1

我发布了.emacs.d,但使用具有私有更改(密码等)的子仓库。为了允许其他人克隆它,默认分支指向一个占位符子仓库,并且每台机器都有自己的命名分支。

在机器之间合并时,我首先graft将新更改合并到default分支中,然后将default分支合并到其他工作场所分支中。

例如,您可以在bitbucket上找到我的.emacs.d ,其中包括自述文件以及简短的使用指南。

您可能需要将组织模式合并驱动程序添加到此设置。


1

经过几次迭代,我确定,尽管版本控制非常适合共享代码和跟踪更改,但对于在计算机之间同步快速变化的配置来说,这并不是一个很好的解决方案。原因是有许多事情应该同步,而不应该在版本控制中。一些例子:

  1. .elc文件(在进行配置更改时重新编译它们是一个主要麻烦,而过时elc文件中的错误通常很难调试)。
  2. 整个elpa目录(直到版本固定成为标准,否则仍无法自动重建)。
  3. 自动生成的文件,例如eshell历史记录和gnus文件。
  4. 私人信息,例如密码和API密钥。

(请注意,跨平台问题不在列表中-具有一种可以在多个操作系统上运行的配置应该很好。)不是将git用作同步解决方案,而是将其仅用作代码跟踪解决方案并使用Dropbox进行同步。这样,所有不该在版本控制中的烦人的文件都会得到处理。

但是,我确实有一个目标,如果我的Dropbox配置由于某种原因而消失,则可以从源代码重构我的配置,因此,我跟踪所有已安装的软件包以及源代码中没有的软件包。我的私人信息也存储在git子模块中。但是对于日常同步,git并不是一个很好的解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.