.Emacs ve .emacs.d'yi sürüm kontrolünde tutarken ne yapmalı / ne yapmamalıyım?


66

Birçok insan gibi, nokta dosyalarımın çoğunu sürüm kontrol deposu (Bitbucket'te Mercurial, benim durumumda özel) ile yönetiyorum. Bu, yeni bir makine kurarken veya farklı makineler arasında konfigürasyonları geliştirirken kullanışlıdır.

Doğal olarak ben .emacsve .emacs.dbu kuruma ekledim .

Sonra biraz paketleri yüklü ve ekleme sona erdi *.elckardeşime karşı .hgignoreben ihmal gibi, *.pycbenim Python repo dosyaları.

İzlememem gereken başka şeyler var mı, örneğin çevreye özgü ve başka bir platforma klonlandığında kullanışlı / doğru olmayacak üretilen dosyalar mı? (Masaüstünde Linux ve OS X, sunucuda FreeBSD kullanıyorum.)

Bu tür paylaşımları daha değerli kılmak için yaygın olarak kullanılan kurulum püf noktaları var mı? Shell dosya kurulumumla, mesela şubelerdeki münferit dosyaları tek tek seçerek seçmenin iyi yollarını arıyorum.


Sadece FYI, Aşağıda söylenenlere rağmen, tüm bilgisayarlarda aynı emacs sürümünü kullanıyorsanız, Elpa dizinini senkronize etmek gayet iyi.
Malabarba

Yanıtlar:


37

Emacs yapılandırmamı Github'da saklıyorum, çünkü biri işte diğeri evde iki farklı bilgisayar kullanıyorum.

Kaynak kontrolüne girmediğim şeylerin listesi:

Belirtilen ortam ayarları.

Örneğin, Emac'larım başlangıçta farklı makinelerde farklı org dosyaları açar. Bu ayarları kaynak kontrolüne dahil etmek istemezsiniz.

(require 'local nil t)Bu ayarları yüklemek için kullanıyorum , ancak asla işlem yapmıyorum local.el.

Paket yöneticisi tarafından yönetilen paketler

Paketler paket yöneticisi tarafından yönetildiğinde, bu paketleri kaynak kontrolüne koymamayı öneririm. Çünkü :

  1. Her güncellemeden sonra taahhütte bulunmalısınız.
  2. Sizi farklı bir bilgisayarda düzgün şekilde senkronize edememenizi sağlayan başka bir yerde saklayan önemli dosyaları kaçırabilirsiniz.

Paketleri yerine, paket yöneticiniz tarafından tanınan mekanizmayı kabul etmenizi öneririm .

Örneğin, 3. paketlerimi yönetmek için Cask kullanıyorum , bu yüzden sadece istediğim paketleri içeren fıçı dosyasını taahhüt ediyorum.

Daha package.elönce kullandığımda konfigürasyonum paketin kurulup kurulmadığını / güncellenmesi gerekip gerekmediğini kontrol edecek, bu yüzden hiçbir paket taahhüt edilmemiş.

Bununla birlikte , herhangi bir paket deposunda olmayan bazı paketler var, bu durumda, onu olduğu gibi kaynak kontrolüne adayacağım site-lisp.

Paketler tarafından oluşturulan tüm dosyalar

Örneğin, tüm otomatik kaydetme, yedekleme dosyaları, tramp, eshell, recentf, hatta custom.el. Bu dosyaları içine koydum ~/.emacs/.gen, bu yüzden bu dizini görmezden gelebilirim.

Sık sık değişen ancak senkronize edilmesi gereken dosyalar

Tarafından kullanılan kişisel sözlük dosyası aspell, tarafından kullanılan dosya veritabanı elfeed, Bu durumda, farklı bilgisayarlar arasında senkronize etmek için Dropbox kullanıyorum. Bu yüzden taahhüt etmeyi unutmayacağım.


2
Cask ile ilgili mesele, yalnızca Windows değil, Cask'ı destekleyen makinelerle çalıştığınız sürece sorun değil.
T. Verron

Bazı kullanıcılar, her güncellemeden sonra paket işlemeyi tamamlayabilir, önerilmemesi durumunda paketin tamamını saklamamalarını önerebilirim. Paket yöneticisinin işi yapmasına izin verin.
Rangi Lin

@ T.Verron Cask'ı Cygwin'de çalıştırmayı başardım, ama bu bana biraz sıkıntı verdi . BTW, şu anda Emacs Prelude kullanıyorum ve prelude-require-packagesfonksiyonun fakir bir adamın Fıçısı olarak çalıştığını gördüm (Windows ile birlikte çalışmanın avantajıyla).
rsenna

Cygwin fıçısı w32 emacs ile çalışır mı? Bu davranışı empoze eden makrolar package-installsöz konusu olduğunda, emacs.stackexchange.com/a/410/184 de belirtilen yerleşik de yardımcı olabilir.
T. Verron

2
@JorgeArayaNavarro Farklı makineler arasında aynı olacaklarsa, bunu işlemek mükemmel. :) ama benim durumumda değil. Dahası, otomatik olarak düzenleneceğinden, bazen taahhüt etmeyi unuttuğum için custom.elkaynak kontrolüne girmiyorum .
Rangi Lin

8

Sadece depoda oluşturulmuş hiçbir şeyin (@ rangi-lin notları gibi) depoda olmadığından ve nokta dosyalarınızı başkalarıyla paylaşıyorsanız, ilgili güvenlik malzemesi (şifreler ve API anahtarları gibi) olmadığından emin olun. Daha sonraları için özelleştirmelerimi ayrı bir dosyaya böldüm:

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

Bazen "güvenli" özelleştirmeleri setqyukarıdaki kod parçasından önce büyük bir ifadeye taşırım .

.Gitignore dosyam şuna benziyor:

/.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.elyerine kullanmak.emacs
  • senin yapmak .gitignorebeyaz liste
  • paket yöneticisi kullan

.emacs.d / init.el

Bunun .emacs.d/init.elyerine kullanıyorum .emacsçünkü bu kurulum gitmeme izin veriyor .emacs.d. Having ~/.emacsEğer git depo simgesel bir bağlantı oluşturmak için veya ev dizininde git repo sahip olmayı gerekli kılar. Eğer kullanırsan .emacs.d, hepsi çözülür.

.gitignore

.Gitignore, varsayılan kara liste yerine beyaz liste.

*

!.gitignore
!init.el

Bu konfigürasyon, ihtiyaç duymadığınız şey yerine gerçekten ihtiyaç duyduğunuz şeye konsantre olmanızı sağlar. .emacs.dkaynak kod deposu gibi değil, yalnızca kodunuzun bulunduğu anlamına gelmez, aynı zamanda diğer tüm otomatik oluşturulan veya geçici dosyaların oraya gider. Ne olacağını gerçekten bilmiyorsunuz. Yani, " varsayılan olarak tümünü yoksay ve ilgilendiğiniz dosyaları ekleyin " daha iyi bir stratejidir, IMO.

BTW, init.elçoklu dosya şeması kullanmak yerine çoğu yapılandırmayı içinde tutarım . Bunun nedeni, büyük bir dosyanın benden a) istediğim gibi standart araçları kullanmamı occurveya isearch-forwardistediğim yapılandırmaya geçmemi, b) outshinebenim init.el org-cycle-able yapmamı, c) .gitignoreher zaman değişmemesini sağlar .

Paketleme yöneticisi

Tüm sisteminizde Emacs sürümünü ve / veya Paketleri sürümünü senkronize etmek için özel ihtiyaçlarınız yoksa, paketleri git altına almayın. Package.eliyi. use-packageayrıca iyi. Fıçı güzel. Paket yöneticinizi seçin ve yalnızca yapılandırma dosyanızı taahhüt edin, ancak paketin kendisini değil.

yani. Aklıma gelen özel ihtiyaçlardan biri iki sisteme sahip olmak, bir geliştirme ve dağıtım ve aynı Emacs konfigürasyonuna sahip olmalarıydı.


Her şeyi tek bir init.eldosyada tutmak , o dosya çok büyük olmadıkça çalışır. Emacs büyük dosyaları işlemek için iyi değildir ve bir süre sonra büyükleri düzenlerken sadece taramaya başlar init.el. Konfigürasyonunuzu birden fazla dosyaya bölmenin bir başka avantajı da, gitmiş durumla daha iyi oynamasıdır; bu, bazı durumlarda, tek bir dosyadaki değişiklikleri bir birleştirme çatışması olarak düşünebilir, ancak değişiklikler ayrı dosyalarda ise. Son olarak, init dosyanızdaki büyük parçalardan ziyade sadece tek gereklilikleri yorumlamak çok daha kolaydır.
izkon

6

.Hgignore'umda aşağıdaki şeyler var.

  • emacs sunucu dosyası
  • recentf dosyası: Bir makinedeki dosya yolları diğerine mantıklı gelmez
  • elpa / melpa dizini: Gerekli paketleri otomatik olarak kurmak ve çekme / basma zamanlarını kaydetmek için init dosyasını kullanın.

Init'inizi başkalarıyla paylaşmak istiyorsanız, savehist modu tarafından oluşturulanlar gibi geçmiş dosyalarını silmeyi düşünebilirsiniz. Bunun dışında bunun için özel bir püf noktası olduğunu sanmıyorum. Kod projeleri geliştirmek için uyguladığınız yönergeler burada da iyi çalışır.


3

Zamanla paketler bir çok şey ekler ~/.emacsve sonunda onları teker teker eklerim .gitignore. Ayrıca bir private.elşifre, makineye özgü kod vb. İzlemiyorum.

Şimdi sahip olduğum şey bu.

# 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

Hangi paketleri / özellikleri kullandığınıza bağlı, bu yüzden aldatıcı olabilir. Vamsi tarafından belirtilen dosyaların yanında, örneğin, dired-immage kullanıyorsanız, küçük resimleri önbelleğe almak için orada bir dizin oluşturur. Muhtemelen .elc dosyalarını da görmezden gelmek isteyebilirsiniz.


1

.Emacs.d dosyasını yayınlarım, ancak özel değişikliklerle (parola vb.) Bir alt rapor kullanın. Başkalarının klonlamasını sağlamak için, varsayılan dal bir yer tutucu alt raporuna işaret eder ve her makinenin kendi adlandırılmış dalına sahiptir.

Makineler arasında birleşme yaparken önce branşta graftyeni değişiklikler yapıyorum , defaultardından defaultşubeyi diğer işyeri şubelerinde birleştiriyorum .

Örnek olarak, sen benim .emacs.d bulabilirsiniz bitbucket üzerinde kısa bir kullanım kılavuzu ile bir Benioku'da dahil.

Org modu birleştirme sürücüsünü bu kuruluma eklemek isteyebilirsiniz .


1

Birkaç yinelemeden sonra, sürüm kontrolü kod paylaşımı ve değişiklikleri izlemek için harika olsa da, bilgisayarlar arasında hızla değişen bir yapılandırmayı eşitlemek için mükemmel bir çözüm olmadığını belirledim. Bunun nedeni, senkronize edilmesi gereken ve sürüm kontrolünde olmaması gereken birçok şey olması . Bazı örnekler:

  1. .elcdosyalar (yapılandırma değişikliği olduğunda onları yeniden derlemek büyük bir güçlüktür ve eski elcdosyalardan kaynaklanan hatalar genellikle hata ayıklamak için bir acıdır).
  2. Dizinin tamamı elpa(ve sürüm sabitleme standart hale gelene kadar otomatik olarak yeniden oluşturma işlemi yeterince güvenilir değildir).
  3. eshellGeçmiş ve gnusdosyalar gibi otomatik oluşturulan dosyalar.
  4. Şifreler ve API anahtarları gibi özel bilgiler.

(Platformlar arası sorunların listede olmadığını unutmayın - birden fazla işletim sisteminde çalışan tek bir yapılandırmaya sahip olmak tamamen iyi olmalıdır.) Git'i bir senkronizasyon çözümü olarak kullanmak yerine, onu yalnızca bir kod izleme çözümü olarak kullanıyorum ve Dropbox kullanarak senkronize edin. Bu şekilde, sürüm kontrolünde olmaması gereken tüm sinir bozucu dosyalar halledilir.

Ben do , ancak, benim Dropbox yapılandırma sebebi ne olursa olsun kaybolursa benim yapılandırma kaynağından rebuildable olmak zorunda bir amacı var, bu yüzden yüklü paketlerin ve etajer kaynağında takip edebilirsiniz. Özel bilgilerim git alt modülünde de saklanır. Ancak günlük senkronizasyon için git sadece mükemmel bir çözüm değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.