O que devo / não devo fazer ao manter .emacs e .emacs.d no controle de versão?


66

Como muitas pessoas, eu gerencio muitos dos meus arquivos de ponto através de um repositório de controle de versão (Mercurial on Bitbucket, private, no meu caso). Isso é útil ao configurar uma nova máquina ou propagar configurações entre máquinas diferentes.

Então, naturalmente, eu adicionei o meu .emacse .emacs.da essa configuração.

Em seguida, instalei alguns pacotes e acabei adicionando *.elcaos meus .hgignore, assim como omito *.pycarquivos dos meus repositórios Python.

Há outras coisas que eu não deveria estar rastreando, por exemplo, arquivos gerados que são específicos do ambiente e não serão úteis / corretos quando clonados em outra plataforma? (Eu uso Linux e OS X na área de trabalho e FreeBSD no servidor.)

Existem truques de configuração que são comumente usados ​​para tornar esse tipo de compartilhamento mais valioso? Com a minha configuração de arquivo shell, ainda estou procurando boas maneiras de escolher arquivos individuais entre as filiais, por exemplo.


Apenas para sua informação, apesar do que foi dito abaixo, se você usar a mesma versão do emacs em todos os seus computadores, a sincronização do diretório Elpa é perfeita.
Malabarba 26/09/14

Respostas:


37

Eu armazeno minha configuração do Emacs no Github porque uso dois computadores diferentes, um no trabalho e outro em casa.

Aqui está uma lista sobre coisas que eu não coloco no controle de origem:

Configurações especificadas no ambiente.

Por exemplo, meu Emacs abre um arquivo organizacional diferente na inicialização em uma máquina diferente. Você não deseja confirmar essas configurações no controle de origem.

Eu uso (require 'local nil t)para carregar essas configurações, mas nunca confirmo local.el.

Pacotes gerenciados pelo gerenciador de pacotes

Quando os pacotes são gerenciados pelo gerenciador de pacotes, sugiro não colocar esses pacotes no controle de origem. Porque :

  1. Você precisa confirmar após cada atualização.
  2. Você pode perder arquivos importantes que são armazenados em outro lugar, o que impossibilita a sincronização entre computadores diferentes corretamente.

Em vez de confirmar pacotes, sugiro que você confirme o mecanismo reconhecido pelo seu gerenciador de pacotes.

Por exemplo, eu uso o Cask para gerenciar meus terceiros pacotes, portanto, apenas confirmo o arquivo cask, que contém os pacotes especificados que eu quero.

Quando eu uso package.elantes, minha configuração verifica se o pacote está instalado / precisa ser atualizado, portanto, nenhum pacote foi confirmado.

No entanto , existem alguns pacotes que não existem em nenhum repositório de pacotes; nesse caso, eu o comprometerei com o controle de origem, como em site-lisp.

Todos os arquivos gerados pelos pacotes

Por exemplo, toda a gravação automática, os arquivos de backup, tramp, eshell, recentf, mesmo custom.el. Coloquei esses arquivos em ~/.emacs/.gen, para que eu possa simplesmente ignorar este diretório.

Arquivos que mudam frequentemente, mas precisam ser sincronizados

Como arquivo de dicionário pessoal usado por aspell, banco de dados de arquivo usado por elfeed. Nesse caso, eu uso o Dropbox para sincronizá-lo em diferentes computadores. Então não esquecerei de me comprometer.


2
A questão sobre o Cask é boa desde que você trabalhe apenas com máquinas compatíveis com o Cask, principalmente o Windows.
T. Verron

Algumas pessoas podem aprovar pacotes após cada atualização, se não, sugiro que não armazene o pacote inteiro. Deixe o gerente de pacotes fazer o trabalho.
Rangi Lin

@ T.Verron Consegui fazer o Cask funcionar no Cygwin, mas isso me deu alguns problemas. BTW, agora estou usando o Emacs Prelude e descobri que a prelude-require-packagesfunção funciona como um Cask de pobre (com a vantagem de também trabalhar com o Windows).
rsenna

O cygwin cask funciona com o w32 emacs? Quando se trata de macros que simulam esse comportamento, o internopackage-install mencionado em emacs.stackexchange.com/a/410/184 também pode ser útil.
T. Verron

2
@JorgeArayaNavarro É perfeitamente aceitável enviá-lo se eles forem iguais em diferentes máquinas. :) mas não é no meu caso. Além do mais, como ele será editado automaticamente, às vezes esqueço de confirmar, é por isso que não coloco custom.elno controle de origem.
Rangi Lin

8

Apenas certifique-se de que nenhum material gerado (como @ rangi-lin notes) esteja no repositório e, se você estiver compartilhando seus arquivos de pontos com outras pessoas, não haverá itens de segurança relacionados (como senhas e chaves de API). Para os últimos, eu dividi minhas personalizações em um arquivo separado com:

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

Ocasionalmente, movo personalizações "seguras" para uma grande setqdeclaração antes do snippet acima.

Meu arquivo .gitignore se parece com:

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

8

tl; dr

  • use em .emacs.d/init.elvez de.emacs
  • faça da sua .gitignoreuma lista branca
  • use um gerenciador de pacotes

.emacs.d / init.el

Eu uso em .emacs.d/init.elvez de, .emacspois essa configuração me permite colocar .emacs.dno git. Tendo ~/.emacsfaz com que você crie um link simbólico para o repositório git ou tenha o repositório git em seu diretório pessoal. Se você usar .emacs.d, tudo está resolvido.

.gitignore

Meu .gitignore é uma lista em branco em vez da lista em preto padrão.

*

!.gitignore
!init.el

Essa configuração permite que você se concentre no que realmente precisa, em vez do que não precisa. .emacs.dnão é como o repositório de código-fonte, o que significa que não apenas seu código reside, mas também todos os outros arquivos temporários gerados automaticamente. Você realmente não sabe o que entrará. Portanto, " ignorar tudo por padrão e adicionar arquivos de seu interesse " é uma estratégia melhor, IMO.

BTW, eu mantenho a maior parte da configuração no init.el, em vez de usar o esquema de vários arquivos. A razão é que um arquivo grande me permite: a) usar ferramentas padrão como occurou isearch-forwardmudar para a configuração que eu quero; b) usar o outshineque torna meu init.el org-cycle-able; c) não mudar o meu .gitignoreo tempo todo.

Gerenciador de pacotes

A menos que você tenha necessidades especiais de sincronizar a versão do Emacs e / ou a versão Packages em todo o seu sistema, não coloque os pacotes no git. Package.elestá bem. use-packagetambém está bem. Cask é legal. Escolha seu gerenciador de pacotes e confirme apenas seu arquivo de configuração, mas não o próprio pacote.

ie Uma das necessidades especiais em que posso pensar seria ter dois sistemas, um desenvolvimento e implantação, e eles devem ter exatamente a mesma configuração do Emacs.


Manter tudo em um init.elarquivo funciona, desde que esse arquivo não fique muito grande. O Emacs não é bom em lidar com arquivos grandes e, depois de um tempo, começa a rastrear ao editar um arquivo grande init.el. Outra vantagem de dividir sua configuração em vários arquivos é que eles funcionam melhor com o git, que em determinadas situações pode considerar que as alterações em um único arquivo sejam um conflito de mesclagem, mas não se as alterações estiverem em arquivos separados. Finalmente, é muito mais fácil comentar apenas requisitos únicos do que grandes partes do seu arquivo init.
17/07

6

Eu tenho as seguintes coisas no meu .hgignore

  • arquivo do servidor emacs
  • arquivo recentf: os caminhos de arquivo em uma máquina não fazem sentido em outra
  • Diretório elpa / melpa: Use o arquivo init para instalar automaticamente os pacotes necessários e economizar os tempos de extração / envio.

Se você deseja compartilhar seu init com outras pessoas, considere remover todos os arquivos de histórico, como o criado pelo modo savehist. Além disso, acho que não há truques especiais para isso. Todas as diretrizes que você segue para projetos de código de versão funcionam bem aqui também.


3

Com o tempo, os pacotes adicionam muitas coisas ~/.emacse acabo adicionando-os um a um ao meu .gitignore. Eu também tenho um private.elque contém senhas, código específico da máquina, etc, que eu não acompanho.

Isto é o que eu tenho agora.

# 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

Depende de quais pacotes / recursos você usa, para que fique complicado. Além dos arquivos mencionados por Vamsi, por exemplo, se você usar o dired-immage, ele criará um diretório para armazenar miniaturas em cache. É provável que você queira ignorar arquivos .elc também.


1

Publico meu arquivo .emacs.d, mas uso um subrepo com as alterações privadas (senhas e outras). Para permitir que outras pessoas o clonem, a ramificação padrão aponta para um subrepo de espaço reservado e cada máquina tem sua própria ramificação nomeada.

Ao mesclar entre máquinas, primeiro graftas novas alterações na defaultfilial e depois as defaultmesclamos nas outras ramificações do local de trabalho.

Como exemplo, você pode encontrar meu arquivo .emacs.d no bitbucket , incluindo um leia-me com um breve guia de uso.

Convém adicionar o driver de mesclagem no modo organizacional a essa configuração.


1

Após várias iterações, determinei que, embora o controle de versão seja ótimo para compartilhar código e rastrear alterações, não é uma ótima solução para sincronizar uma configuração que muda rapidamente entre computadores. O motivo é que há muitas coisas que devem ser sincronizadas e não devem estar no controle de versão. Alguns exemplos:

  1. .elcarquivos (recompilá-los quando houver uma alteração na configuração é um grande aborrecimento e os erros de elcarquivos desatualizados costumam ser difíceis de depurar).
  2. O elpadiretório inteiro (e até que a fixação da versão se torne padrão, a reconstrução automática apenas não é confiável o suficiente).
  3. Arquivos gerados automaticamente, como eshellhistórico e gnusarquivos.
  4. Informações privadas, como senhas e chaves de API.

(Observe que os problemas entre plataformas não estão na lista - deve ser perfeitamente adequado ter uma configuração que funcione em vários sistemas operacionais.) Em vez de usar o git como uma solução de sincronização, eu o uso apenas como uma solução de rastreamento de código e sincronize usando o Dropbox. Dessa forma, todos os arquivos irritantes que não deveriam estar no controle de versão são resolvidos.

Eu não , no entanto, ter um objetivo de ter a configuração do meu ser rebuildable da fonte, se a configuração do meu Dropbox desaparece por qualquer razão, então eu manter o controle de todos os pacotes instalados e outros enfeites na fonte. Minhas informações privadas também são armazenadas em um submódulo git. Mas, para a sincronização diária, o git simplesmente não é uma ótima solução.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.