Що я повинен / не повинен робити під час зберігання .emacs та .emacs.d в контролі версій?


66

Як і багато людей, я керую багатьма моїми dotfiles через сховище контролю версій (Mercurial on Bitbucket, приватний, в моєму випадку). Це зручно під час налаштування нової машини або поширення конфігурацій серед різних машин.

Тож природно я додав своє .emacsі .emacs.dдо цього налаштування.

Потім я встановив кілька пакунків і в кінцевому підсумку додав *.elcдо своїх .hgignore, як і я опускаю *.pycфайли з мого репоту Python.

Чи є інші речі, які я не повинен відслідковувати, наприклад, генеровані файли, які є специфічними для навколишнього середовища і не будуть корисними / правильними під час клонування на іншу платформу? (Я використовую Linux та OS X на робочому столі та FreeBSD на сервері.)

Чи є якісь хитрощі налаштування, які зазвичай використовуються для того, щоб зробити такий спосіб спільного використання більш цінним? Налаштування файлу оболонки я все ще шукаю хороші способи, наприклад, вибирати окремі файли у гілках, наприклад.


Просто FYI, незважаючи на те, що сказано нижче, якщо ви використовуєте ту саму версію emacs на всіх своїх комп’ютерах, синхронізація каталогу Elpa - це прекрасно.
Малабарба

Не виключайте *.elc. stackoverflow.com/a/24539894/324105
Филс

Відповіді:


37

Я зберігаю свою конфігурацію Emacs у Github, оскільки я використовую два різні комп’ютери, один на роботі, а один вдома.

Ось перелік речей, які я не перебуваю в контролі джерел:

Установки, задані оточенням.

Наприклад, мій Emacs відкриває різні файли org при запуску на різних машинах. Ви не хочете зазначати ці налаштування в контролі джерела.

Я використовую (require 'local nil t)для завантаження цих налаштувань, але ніколи не здійснюю local.el.

Пакети, якими керує менеджер пакунків

Коли пакетами керує менеджер пакунків, я пропоную не вводити ці пакети у вихідний контроль. Оскільки :

  1. Ви повинні взяти на себе зобов’язання після кожного оновлення.
  2. Ви можете пропустити важливий файл, який зберігається десь в іншому місці, через який ви не зможете належним чином синхронізуватися на різних комп’ютерах.

Замість введення пакетів я пропоную вам скористатися механізмом, який розпізнає ваш менеджер пакунків.

Наприклад, я використовую Cask для управління своїми третіми пакунками, тому я фіксую лише файл cask, який містить вказані мені пакети.

Коли я використовую package.elраніше, моя конфігурація перевірить, чи встановлено пакет / потребує оновлення, так що жоден пакет не вчиняється.

Однак є деякі пакети, яких немає в жодному сховищі пакунків, в цьому випадку я зроблю його для управління джерелом, наприклад, в site-lisp.

Усі файли, згенеровані пакетами

Наприклад, всі автосохранение, резервне копіювання файлів, tramp, eshell, recentf, навіть custom.el. Я вкладаю ці файли ~/.emacs/.gen, тому я можу просто проігнорувати цю директорію.

Файли, які часто змінюються, але потребують синхронізації

Наприклад aspell, файл особистого словника, використовуваний , використовувана база даних файлів. elfeedУ цьому випадку я використовую Dropbox, щоб синхронізувати його на різних комп'ютерах. Тож я не забуду покластися.


2
Справа про Cask нормальна, якщо ви працюєте лише з машинами, які підтримують Cask, особливо це стосується Windows.
Т. Веррон

Деякі люди можуть закинути пакети після кожного оновлення, якщо ні, я пропоную не зберігати весь пакет. Нехай менеджер пакунків виконує роботу.
Рангі Лін

@ T.Verron Мені вдалося змусити Каска працювати над Cygwin, але це доставило мені певні проблеми. До речі, зараз я використовую Emacs Prelude , і я виявив, що prelude-require-packagesфункція працює як Cask у бідного чоловіка (з перевагою також працювати з Windows).
rsenna

Чи працює цигуїнова скринька з w32 emacs? Що стосується макросів, що імітують цю поведінку, також може бути корисним вбудований package-installзгаданий в emacs.stackexchange.com/a/410/184 .
Т. Веррон

2
@JorgeArayaNavarro Цілком чудово це зробити, якщо вони будуть однакові на різних машинах. :) але це не в моєму випадку. Більше того, оскільки він буде редагуватися автоматично, коли-небудь я забуваю зробити це, тому я не ставлю custom.elв контроль джерел.
Рангі Лін

8

Просто переконайтеся, що жодних згенерованих матеріалів (наприклад, @ rangi-lin notes) немає в репо, і якщо ви ділитесь своїми дотфайлами з іншими людьми, жодних пов’язаних матеріалів безпеки (наприклад, паролів та ключів 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

тл; д-р

  • використовувати .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.

BTW, я зберігаю більшу частину конфігурації в init.el, замість того , щоб використовувати багатофайлові схеми. Причина полягає в тому, що великий файл дозволяє мені а) використовувати стандартні засоби occurабо isearch-forwardдля переходу до конфігурації я хочу, б) використання , outshineщо робить мій init.el org-cycle-able, в) не змінити .gitignoreвесь час.

Менеджер пакетів

Якщо у вас немає особливих потреб синхронізувати версію Emacs та / або Версію пакетів у всій вашій системі, не ставте пакети під git. Package.elдобре. use-packageтеж добре. Каска приємна. Виберіть менеджера пакунків і введіть лише свій файл конфігурації, але не сам пакет.

тобто. Однією з особливих потреб, яку я можу придумати, буде наявність двох систем, розробка та розгортання, і вони повинні мати точно таку ж конфігурацію Emacs.


Зберігання всього в одному init.elфайлі працює до тих пір, поки цей файл не стане занадто великим. Emacs не дуже підходить для обробки великих файлів, і через деякий час він просто починає повзати при редагуванні великих init.el. Ще одна перевага розділення конфігурації на кілька файлів полягає в тому, що вони краще грають з git, що в певних ситуаціях може вважати зміни одного файлу конфліктом злиття, але це не так, якщо зміни є в окремих файлах. Нарешті, набагато простіше коментувати лише окремі потреби, ніж великі шматки вашого файлу init.
izkon

6

У моєму .hgignore є такі речі

  • файл сервера emacs
  • файл recentf: шляхи до файлів на одній машині не мають сенсу на іншій
  • Каталог elpa / melpa: Використовуйте файл init для автоматичного встановлення необхідних пакетів та збереження часу "pull / push".

Якщо ви хочете поділитися своїм 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, він створює там каталог для кешування мініатюр. Ви, ймовірно, хочете ігнорувати файли .elc.


1

Я публікую свій .emacs.d, але використовую subrepo з приватними змінами (паролями та подібними). Щоб дозволити іншим клонувати його, гілка за замовчуванням вказує на субрепорту заповнювача, і кожна машина має власну названу гілку.

Під час злиття між машинами я спочатку graftнові зміни в defaultгілку, а потім об'єдную defaultгілку в інші відділення робочого місця.

Наприклад, ви можете знайти мій .emacs.d в bitbucket , включаючи readme з коротким посібником із використання.

Ви можете додати в цю установку драйвер злиття в режимі org .


1

Після кількох ітерацій я визначив, що, хоча контроль версій відмінно підходить для спільного використання коду та відстеження змін, це не чудове рішення для синхронізації швидко мінливої ​​конфігурації на комп’ютерах. Причина в тому, що існує багато речей, які слід синхронізувати і не повинні знаходитись у контролі версій. Деякі приклади:

  1. .elcфайли (перекомпіляція їх, коли зміна конфігурації - це велика проблема, а помилки застарілих elcфайлів часто є налагодженням).
  2. Весь elpaкаталог (і доки встановлення версії не стане стандартним, автоматичне відновлення його просто недостатньо надійне).
  3. Автоматично створені файли, такі як eshellісторія та gnusфайли.
  4. Приватна інформація, така як паролі та ключі API.

(Зауважте, що проблем із міжплатформою немає у списку - це має бути ідеально добре мати одну конфігурацію, яка працює в декількох операційних системах.) Замість того, щоб використовувати git як рішення для синхронізації, я використовую його виключно як рішення для відстеження коду та синхронізувати за допомогою Dropbox. Таким чином, дбають про всі дратівливі файли, які не повинні знаходитись у контролі версій.

Я ж , тем НЕ менш, є мета мати моє конфігурація буде REBUILDABLE від джерела , якщо моя конфігурація Dropbox зникає з якої - небудь причини, тому я встежити всіх встановлених пакетів і етажерки в джерелі. Моя приватна інформація також зберігається в підмодулі git. Але для щоденної синхронізації git просто не чудове рішення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.