ฉันควร / ไม่ควรทำอะไรเมื่อรักษา. emacs และ. emacs.d ในการควบคุมเวอร์ชัน?


66

เช่นเดียวกับหลาย ๆ คนฉันจัดการ dotfiles จำนวนมากผ่านที่เก็บข้อมูลการควบคุมเวอร์ชัน (Mercurial บน Bitbucket ส่วนตัวในกรณีของฉัน) สิ่งนี้มีประโยชน์เมื่อตั้งค่าเครื่องใหม่หรือเผยแพร่การกำหนดค่าระหว่างเครื่องต่างๆ

ดังนั้นโดยธรรมชาติฉันเพิ่มของฉัน.emacsและ.emacs.dการตั้งค่านี้

จากนั้นฉันติดตั้งแพคเกจบางรายการและลงเอยด้วยการเพิ่ม*.elcลงในไฟล์ของฉัน.hgignoreเช่นเดียวกับที่ฉันละเว้น*.pycไฟล์จาก Python repos

มีสิ่งอื่นใดอีกที่ฉันไม่ควรติดตามเช่นไฟล์ที่สร้างขึ้นซึ่งเฉพาะสภาพแวดล้อมและจะไม่เป็นประโยชน์ / ถูกต้องเมื่อถูกโคลนไปยังแพลตฟอร์มอื่นหรือไม่? (ฉันใช้ Linux และ OS X บนเดสก์ท็อปและ FreeBSD บนเซิร์ฟเวอร์)

มีเทคนิคการตั้งค่าที่ใช้กันโดยทั่วไปเพื่อให้การแบ่งปันประเภทนี้มีค่ามากขึ้นหรือไม่? ด้วยการตั้งค่าไฟล์เปลือกของฉันฉันยังคงมองหาวิธีที่ดีในการเลือกไฟล์แต่ละไฟล์ในแต่ละสาขา


เพียงแค่ FYI แม้ว่าจะมีการกล่าวถึงด้านล่างนี้หากคุณใช้ emacs รุ่นเดียวกันในคอมพิวเตอร์ทุกเครื่องของคุณการซิงค์ไดเรกทอรี Elpa นั้นใช้ได้อย่างสมบูรณ์แบบ
Malabarba

*.elcไม่ได้ยกเว้น stackoverflow.com/a/24539894/324105
phils

คำตอบ:


37

ฉันเก็บการกำหนดค่า Emacs ของฉันใน Github เพราะฉันใช้คอมพิวเตอร์สองเครื่องที่แตกต่างกันหนึ่งที่ทำงานหนึ่งที่บ้าน

นี่คือรายการเกี่ยวกับสิ่งต่าง ๆ ที่ฉันไม่ได้ใส่ไว้ในการควบคุมแหล่งที่มา:

สภาพแวดล้อมการตั้งค่าที่ระบุ

ตัวอย่างเช่น Emacs ของฉันเปิดไฟล์ org ต่าง ๆ เมื่อเริ่มต้นที่เครื่องอื่น คุณไม่ต้องการกำหนดการตั้งค่าเหล่านี้ในการควบคุมแหล่งที่มา

ผมใช้(require 'local nil t)โหลดการตั้งค่าเหล่านี้ local.elแต่ไม่เคยกระทำ

แพ็คเกจที่จัดการโดยผู้จัดการแพคเกจ

เมื่อแพ็คเกจได้รับการจัดการโดยผู้จัดการแพ็คเกจฉันแนะนำไม่ให้วางแพ็คเกจเหล่านั้นลงในการควบคุมแหล่งที่มา เพราะ :

  1. คุณต้องกระทำหลังจากอัพเดททุกครั้ง
  2. คุณสามารถพลาดไฟล์สำคัญที่เก็บไว้ที่อื่นซึ่งทำให้คุณไม่สามารถซิงโครไนซ์ผ่านคอมพิวเตอร์เครื่องอื่นได้อย่างเหมาะสม

แทนที่จะมอบแพ็คเกจฉันแนะนำให้คุณใช้กลไกที่ผู้จัดการแพคเกจของคุณรู้จัก

ตัวอย่างเช่นฉันใช้Caskเพื่อจัดการแพ็คเกจที่ 3 ของฉันดังนั้นฉันจะส่งไฟล์ cask เท่านั้นซึ่งมีแพ็คเกจที่ระบุที่ฉันต้องการ

เมื่อฉันใช้package.elก่อนหน้านี้การกำหนดค่าของฉันจะตรวจสอบว่ามีการติดตั้งแพคเกจ / จำเป็นต้องอัปเดตหรือไม่ดังนั้นจึงไม่มีการส่งมอบแพ็คเกจ

อย่างไรก็ตามยังมีแพคเกจบางอย่างที่ไม่ได้อยู่ในพื้นที่เก็บข้อมูลแพคเกจใด ๆ site-lispในกรณีนี้ผมจะกระทำมันจะควบคุมแหล่งเช่นใน

ไฟล์ทั้งหมดที่สร้างขึ้นโดยแพคเกจ

ยกตัวอย่างเช่นการบันทึกอัตโนมัติทุกไฟล์สำรองtramp, eshell, แม้recentf custom.elฉันใส่ไฟล์เหล่านี้ลงไป~/.emacs/.genดังนั้นฉันจึงไม่สนใจไดเรกทอรีนี้

ไฟล์ที่เปลี่ยนแปลงบ่อย แต่จำเป็นต้องซิงโครไนซ์

เช่นไฟล์พจนานุกรมส่วนบุคคลที่ใช้โดยaspellฐานข้อมูลไฟล์ที่ใช้โดยelfeedในกรณีนี้ฉันใช้ Dropbox เพื่อซิงโครไนซ์กับคอมพิวเตอร์เครื่องอื่น ดังนั้นฉันจะไม่ลืมที่จะกระทำ


2
จุดเกี่ยวกับถังนั้นก็โอเคตราบใดที่คุณทำงานกับเครื่องที่รองรับถังเท่านั้นส่วนใหญ่ไม่ใช่ Windows
T. Verron

บางคนอาจโอเคที่จะยอมรับแพ็คเกจหลังจากการอัพเดททุกครั้งหากไม่ใช่ฉันขอแนะนำว่าอย่าเก็บแพ็คเกจทั้งหมด ให้ผู้จัดการแพคเกจทำงานได้ดี
Rangi Lin

@ T.Verron ฉันสามารถสร้างถังทำงานบน Cygwin ได้ แต่มันทำให้ฉันมีปัญหา BTW ตอนนี้ฉันใช้Emacs Preludeและฉันพบว่า oud prelude-require-packagesฟังก์ชั่นทำงานเป็น Cask ของชายยากจน (ด้วยข้อดีของการใช้งานร่วมกับ Windows ด้วย)
rsenna

cygwin cask ทำงานกับ w32 emacs หรือไม่ เมื่อพูดถึงมาโครที่เลียนแบบพฤติกรรมนี้ตัวในที่package-installกล่าวถึงในemacs.stackexchange.com/a/410/184อาจเป็นประโยชน์เช่นกัน
T. Verron

2
@JorgeArayaNavarro มันสมบูรณ์แบบที่จะยอมรับมันหากพวกเขาจะเหมือนกันในเครื่องที่แตกต่างกัน :) แต่มันไม่ได้อยู่ในกรณีของฉัน ยิ่งไปกว่านั้นเนื่องจากมันจะถูกแก้ไขโดยอัตโนมัติบางครั้งฉันลืมที่จะกระทำนั่นคือสาเหตุที่ฉันไม่ได้custom.elควบคุมแหล่งที่มา
Rangi Lin

8

ตรวจสอบให้แน่ใจว่าไม่มีสิ่งที่สร้างขึ้น (เช่น @ rangi-lin notes) อยู่ใน repo และถ้าคุณแบ่งปัน dotfiles กับผู้อื่นไม่มีสิ่งที่เกี่ยวข้องด้านความปลอดภัยที่เกี่ยวข้อง (เช่นรหัสผ่านและคีย์ 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อยู่ภายใต้คอมไพล์ การ~/.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ค) ไม่เปลี่ยน.gitignoreตลอดเวลา

ผู้จัดการแพ็คเกจ

ยกเว้นว่าคุณมีความต้องการพิเศษในการซิงค์รุ่น Emacs และหรือรุ่นแพคเกจในระบบทั้งหมดของคุณอย่าวางแพ็กเกจไว้ใต้ git Package.elไม่เป็นไร use-packageก็ดี ถังเป็นสิ่งที่ดี เลือกผู้จัดการแพ็คเกจของคุณและส่งเฉพาะไฟล์กำหนดค่าของคุณ แต่ไม่ใช่แพ็คเกจเอง

กล่าวคือ หนึ่งในความต้องการพิเศษที่ฉันคิดว่าน่าจะมีอยู่สองระบบคือการพัฒนาและการปรับใช้และพวกเขาจะต้องมีการกำหนดค่า Emacs เดียวกันทั้งหมด


การทำให้ทุกอย่างในinit.elไฟล์เดียวทำงานได้ตราบใดที่ไฟล์นั้นไม่ใหญ่เกินไป Emacs init.elไม่ดีในการจัดการไฟล์ขนาดใหญ่และหลังจากที่ในขณะที่มันเป็นเพียงแค่การเริ่มต้นในการรวบรวมข้อมูลเมื่อมีการแก้ไขที่มีขนาดใหญ่ ข้อดีอีกประการของการแบ่งการกำหนดค่าของคุณเป็นหลายไฟล์คือพวกเขาเล่นได้ดีขึ้นด้วย git ซึ่งในบางสถานการณ์สามารถพิจารณาการเปลี่ยนแปลงไฟล์เดียวเพื่อให้เกิดความขัดแย้งในการผสาน แต่ไม่ใช่หากการเปลี่ยนแปลงนั้นอยู่ในไฟล์แยกกัน ในที่สุดมันง่ายมากที่จะคอมเม้นท์เพียงครั้งเดียวต้องการมากกว่าชิ้นใหญ่ของไฟล์ init ของคุณ
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

ขึ้นอยู่กับแพ็คเกจ / ฟีเจอร์ที่คุณใช้เพื่อให้สามารถใช้งานได้ยาก ข้างไฟล์ที่กล่าวถึงโดย Vamsi ตัวอย่างเช่นหากคุณใช้ dired-immage มันจะสร้างไดเรกทอรีที่นั่นเพื่อแคชรูปขนาดย่อ คุณอาจต้องการละเว้นไฟล์. elc ด้วย


1

ฉันเผยแพร่. emacs.d ของฉัน แต่ใช้ subrepo กับการเปลี่ยนแปลงส่วนบุคคล (รหัสผ่านและอื่น ๆ ) เมื่อต้องการอนุญาตให้ผู้อื่นลอกแบบนั้นสาขาเริ่มต้นจะชี้ไปที่ subrepo ตัวยึดและทุกเครื่องมีสาขาที่มีชื่อของตัวเอง

เมื่อทำการผสานระหว่างเครื่องจักรฉันจะgraftทำการเปลี่ยนแปลงใหม่ในdefaultสาขาก่อนแล้วจึงรวมdefaultสาขาเข้ากับที่ทำงานอื่น ๆ

ตัวอย่างเช่นคุณสามารถค้นหา. emacs.d ของฉันบน bitbucketรวมถึง readme พร้อมคำแนะนำการใช้งานสั้น ๆ

คุณอาจต้องการเพิ่มไดรเวอร์ผสานโหมดองค์กรในการตั้งค่านี้


1

หลังจากการทำซ้ำหลายครั้งฉันได้พิจารณาแล้วว่าในขณะที่การควบคุมเวอร์ชันนั้นยอดเยี่ยมสำหรับการแชร์รหัสและการติดตามการเปลี่ยนแปลงมันไม่ได้เป็นทางออกที่ดีสำหรับการซิงค์การกำหนดค่าที่เปลี่ยนแปลงอย่างรวดเร็วในคอมพิวเตอร์ เหตุผลก็คือมีหลายสิ่งที่ควรซิงค์และไม่ควรอยู่ในการควบคุมเวอร์ชัน ตัวอย่างบางส่วน:

  1. .elcไฟล์ (การคอมไพล์ใหม่เมื่อมีการเปลี่ยนแปลงการกำหนดค่าเป็นความยุ่งยากที่สำคัญและข้อบกพร่องจากelcไฟล์ที่ล้าสมัยมักจะเป็นปัญหาในการแก้ไขข้อบกพร่อง)
  2. elpaไดเรกทอรีทั้งหมด(และจนกว่าการตรึงเวอร์ชันจะกลายเป็นมาตรฐานการสร้างใหม่โดยอัตโนมัติจะไม่น่าเชื่อถือเพียงพอ)
  3. ไฟล์ที่สร้างขึ้นอัตโนมัติเช่นeshellประวัติและgnusไฟล์
  4. ข้อมูลส่วนตัวเช่นรหัสผ่านและคีย์ API

(โปรดทราบว่าปัญหาข้ามแพลตฟอร์มไม่ได้อยู่ในรายการ - ควรปรับให้สมบูรณ์เพื่อให้มีการกำหนดค่าเดียวที่ใช้งานได้กับระบบปฏิบัติการหลายระบบ) แทนที่จะใช้ git เป็นวิธีการซิงค์ฉันใช้มันเป็นโซลูชันการติดตามรหัสเท่านั้น และซิงค์โดยใช้ Dropbox ด้วยวิธีนี้ไฟล์ที่น่ารำคาญที่ไม่ควรอยู่ในการควบคุมเวอร์ชันจะได้รับการดูแล

ฉันไม่แต่มีเป้าหมายของการมีการกำหนดค่าของฉันจะ rebuildable จากแหล่งถ้ากำหนดค่า Dropbox ของฉันหายไปด้วยเหตุผลใดดังนั้นฉันติดตามทุกแพคเกจติดตั้งและ whatnot ในแหล่งที่มา ข้อมูลส่วนตัวของฉันถูกเก็บไว้ใน submodule คอมไพล์เช่นกัน แต่สำหรับการซิงค์แบบวันต่อวันคอมไพล์ก็ไม่ใช่ทางออกที่ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.