มีระบบควบคุมเวอร์ชันที่ง่ายขึ้นหรือไม่เหมาะสำหรับการเขียนโค้ดที่ไม่ใช่ผู้ใช้ใน Emacs?


28

ฉันเป็นนักวิชาการและฉันชอบทำมากที่สุดในการเขียนของฉันใน Emacs สิ่งสำคัญที่ขาดหายไปสำหรับฉันคือความสามารถในการตรวจสอบการเปลี่ยนแปลงที่ฉันทำกับไฟล์ข้อความได้อย่างง่ายดายตลอดเวลา

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

ฉันไม่คิดว่าจะมีแพ็กเกจใด ๆ ที่ให้ฟังก์ชันการทำงานที่ฉันกำลังมองหาในลักษณะที่ใช้งานง่ายใช่ไหม


3
ฉันแนะนำให้ใช้gitและmagit- github.com/magit/magit - เนื่องจากคุณได้เล่นไปแล้วเล็กน้อย คุณอาจต้องการทำความคุ้นเคยกับตัวเลือกบรรทัดคำสั่งเพื่อให้คุณมีความเข้าใจที่ดีขึ้นเกี่ยวกับสิ่งที่magitกำลังทำ Emacs ไม่ได้มีไว้สำหรับผู้ไม่ใช้โค้ด แต่คุณอยู่ในที่เกิดเหตุมานานพอที่จะไม่กลัวมัน - :) คุณอาจต้องการลองเล่นกับgist: github.com/defunkt/gist.el
ลิสต์กฎหมาย

ในทางเทคนิคเป้าหมายของvc-กลุ่มคำสั่งคือการทำให้กระบวนการใช้ VCS ง่ายขึ้น น่าเสียดายที่พวกเขาไม่ได้ใช้งานง่ายเท่ากับการอนุญาตให้ผู้ใช้ที่ไม่มีประสบการณ์สามารถใช้ประโยชน์ได้ดี ในทางกลับกันระบบเช่นที่คุณพูดถึงนั้นมีข้อ จำกัด มากดังนั้นระบบจึงพัฒนาความต้องการอย่างรวดเร็วซึ่งไม่สามารถสนองตอบได้ gnu.org/software/emacs/manual/html_node/emacs/ ......มีกลไกการเก็บข้อมูลสำรองแบบง่าย ๆ แต่เนื่องจากข้างต้นฉันอยากจะแนะนำให้เรียนรู้การใช้ VCS แทน
wvxvw

6
ฉันยังเป็นนักวิชาการและได้เริ่มใช้git/ magitสำหรับการควบคุมเวอร์ชันของเอกสารของฉัน มันดูน่ากลัวที่จะเริ่ม แต่ก) คุณไม่จำเป็นต้องเรียนรู้ทั้งหมดในครั้งเดียวและ b) มันสนุกที่จะใช้หลังจากผ่านช่วงการเรียนรู้เริ่มต้น เวิร์กโฟลว์ที่ดียังช่วยให้คุณมีวินัยในการเขียนเนื่องจากจะช่วยให้คุณใส่คำอธิบายประกอบสิ่งที่คุณทำซึ่งเป็นวิธีที่ดีในการรับช่วงเวลาของวิวัฒนาการของโครงการเขียน
แดน

คุณใช้ระบบปฏิบัติการอะไร ฉันใช้ RCS มาหลายปีและก่อนหน้านี้ SCCS แต่มันเริ่มเป็นกรณีนี้ไม่ได้รวมอยู่กับระบบปฏิบัติการอีกต่อไปและได้เปลี่ยนมาใช้คอมไพล์เมื่อเร็ว ๆ นี้โดยมีเอกสารบางส่วนอยู่ภายใต้การโค่นล้ม กระบวนการเช็คอินในคอมไพล์มีขั้นตอนพิเศษหนึ่งขั้นเมื่อเทียบกับ RCS แต่ในหลาย ๆ สถานการณ์มันมีประโยชน์มากที่จะมีชุดไฟล์เช็คอินด้วยกัน
Andrew Swann

สิ่งนี้อยู่ในใจของฉันและการกระทำอัตโนมัติอาจเป็นส่วนหนึ่งของเรื่องราว: กระทำโดยอัตโนมัติเมื่อคอมไพล์บันทึกแต่ละ โครงการ
ryuslash.org/git-auto-commit-mode

คำตอบ:


43

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

โพสต์นี้จะมุ่งเน้นgitและอธิบายถึงวิธีการที่จะควบคุมมันจาก Emacs ใช้ Add-on magitแพคเกจที่เรียกว่า ใช่ , gitมีความซับซ้อน แต่คุณไม่จำเป็นต้องเรียนรู้มากที่จะใช้มันงอกงามเพื่อวัตถุประสงค์ที่คุณอธิบาย

ฉันจะสมมติว่าคุณได้gitติดตั้ง (ถ้าคุณทำไม่ได้รับที่นี่ ) และคุณไม่ต้องการออกจาก Emacs เลย


การติดตั้ง magit

magitเป็นgitfront-end สำหรับ Emacs มีให้จากMELPAและคุณสามารถติดตั้งผ่าน:

M-x package-install RET magit RET

เมื่อวันที่ปิดโอกาสที่คุณไม่ได้เปิดใช้ MELPA ในการกำหนดค่าของคุณคุณสามารถหาคำแนะนำเกี่ยวกับวิธีการทำที่นี่

การตั้งค่าที่เก็บ

สมมติว่าคุณมีโฟลเดอร์ที่เรียกว่า~/writingในโฮมไดเร็กตอรี่ของคุณที่มีเอกสารหนึ่งฉบับขึ้นไปที่คุณต้องการให้อยู่ภายใต้การควบคุมเวอร์ชัน

  1. เปิดโฟลเดอร์ใน Dired: C-x d ~/writing RET
  2. เปิดเปลือก: M-x shell RET
  3. ประเภทและตีgit initRET

แค่นั้นแหละ. ตอนนี้คุณมีที่gitเก็บ ไม่จำเป็นต้อง "ลงทะเบียน" ทุกที่ gitเป็นระบบควบคุมเวอร์ชันแบบกระจาย ไม่ต้องการรีโมตเซิร์ฟเวอร์เพื่อติดตามการเปลี่ยนแปลง

ตรวจสอบสถานะของที่เก็บของคุณ

  1. สลับกลับไปเป็นบัฟเฟอร์ Dired ที่แสดงรายการไฟล์ในที่เก็บของคุณ
  2. M-x magit-status RETDo

คุณสามารถนึกถึงบัฟเฟอร์ที่เกิดขึ้นเป็น "แผงควบคุม" ของคุณสำหรับการทำงานกับที่เก็บของคุณ สำหรับที่เก็บใหม่ดูเหมือนว่า:

บัฟเฟอร์สถานะ Magit สำหรับที่เก็บที่สร้างขึ้นใหม่

  • คุณสามารถนำทางระหว่างส่วนต่าง ๆ ของบัฟเฟอร์นี้โดยใช้n( magit-goto-next-section) และp( magit-goto-previous-section)

  • คุณสามารถรีเฟรชบัฟเฟอร์ได้โดยกดg( magit-refresh)

โปรดทราบว่าคุณสามารถแสดงบัฟเฟอร์สถานะจากไฟล์หรือไดเรกทอรีใด ๆ ที่เป็นของที่เก็บที่คุณตั้งค่าไว้ก่อนหน้านี้

กำลังเพิ่มไฟล์

อย่างที่คุณเห็นในภาพหน้าจอมีสามไฟล์ในที่เก็บที่gitไม่ได้ติดตามอยู่ในปัจจุบัน ที่จะบอกgitที่จะเริ่มต้นการติดตามไฟล์ที่คุณจะต้องเวทีsมันด้วยจุดบนไฟล์ที่คุณต้องการเพิ่มกด บัฟเฟอร์สถานะจะมีลักษณะเช่นนี้:

บัฟเฟอร์สถานะ Magit หลังจากเพิ่มไฟล์ -txt

การกระทำ

หลังจากการแสดงละครมากกว่าหนึ่งไฟล์คุณสามารถกระทำc cได้โดยการกดปุ่ม สิ่งนี้จะแสดงบัฟเฟอร์ที่มีลักษณะดังนี้:

Magit buffer สำหรับการป้อนข้อความคอมมิท

ป้อนข้อความการส่งของคุณที่ด้านบนจากนั้นกดC-c C-cเพื่อจบการส่งข้อความ (หากต้องการยกเลิกให้กดC-c C-k)

บัฟเฟอร์สถานะจะมีลักษณะเช่นนี้:

บัฟเฟอร์สถานะ Magit หลังจากส่งครั้งแรก

การเปลี่ยนแปลงการแสดงละคร

หากคุณทำการเปลี่ยนแปลงกับไฟล์ที่ถูกติดตามพวกเขาจะถูกแสดงในส่วนที่แยกต่างหาก ("การเปลี่ยนแปลงแบบไม่มีการจัดการ") ในบัฟเฟอร์สถานะ:

การเปลี่ยนแปลงแบบไม่มีการจัดการ (ยุบ)

หากต้องการตรวจสอบการเปลี่ยนแปลงที่คุณทำกับไฟล์ให้ไปที่บรรทัดที่ระบุModified file-1.txtและกดTAB:

การเปลี่ยนแปลงแบบไม่มีการจัดการ (ขยาย)

หากต้องการแสดงการเปลี่ยนแปลงเหล่านี้ให้กดs:

บัฟเฟอร์สถานะ Magit หลังจากจัดเตรียมการเปลี่ยนแปลงเป็นไฟล์ที่ติดตาม

ดูการกระทำที่ผ่านมา

สุดท้ายหากคุณต้องการตรวจสอบการกระทำที่ผ่านมาคุณสามารถกดl l(นั่นคือ L ตัวพิมพ์เล็กสองตัว):

บัฟเฟอร์บันทึก Magit

ตามปกติคุณสามารถนำทางบัฟเฟอร์ที่มากับและn pMagit จะแสดงการเปลี่ยนแปลงที่เกี่ยวข้องกับการกระทำแต่ละรายการในบัฟเฟอร์นี้ในหน้าต่างแยกต่างหาก

สรุป

จากเปลือก:

  • git init: เริ่มต้นgitพื้นที่เก็บข้อมูลในไดเรกทอรีปัจจุบัน

จากไฟล์หรือไดเร็กทอรีใด ๆ ที่เชื่อมโยงกับที่gitเก็บ:

  • M-x magit-status RET

จากบัฟเฟอร์สถานะ:

  • s เพื่อเพิ่มไฟล์ใหม่หรือการเปลี่ยนแปลงสเตจ

  • c c เพื่อคอมมิชชันการเปลี่ยนแปลงแบบฉาก

    • C-c C-c เพื่อจบการกระทำ
    • C-c C-k เพื่อยกเลิกการกระทำ
  • l l เพื่อดูบันทึกการกระทำ

แค่นั้นแหละ. :)


7
คุณไม่จำเป็นต้องgit initออกจากเปลือก หากคุณโทรหาที่M-x magit-statusอื่นนอกสถานที่เก็บข้อมูลคอมไพล์มันจะเสนอให้ตั้งค่าหนึ่ง (แต่คุณจะต้องเรียกมันอีกครั้งเพื่อเปิดบัฟเฟอร์สถานะหลังจากเสร็จสิ้นการตั้งค่า)
wvxvw

คุณเชื่อฉันว่ามันคุ้มค่าที่จะลองควบคุมเวอร์ชันและนี่ควรเป็นแนวทางที่มีประโยชน์ ขอบคุณ!
Brian Z

1
จนถึงตอนนี้ดีมาก แต่มีความคับข้องใจอย่างหนึ่งคือเมื่อฉันเปลี่ยนคำสองสามคำในวรรคยาวจากนั้นทั้งย่อหน้าก็ถูกเน้นเป็นการเปลี่ยนแปลงแบบเป็นฉาก ฉันต้องการที่จะเห็นการเปลี่ยนแปลงคำต่อคำมากกว่าที่จะทีละบรรทัด
Brian Z

3
@BrianZ คุณสามารถปรับแต่งตัวแปรmagit-diff-refine-hunkเพื่อให้ได้พฤติกรรมที่คุณต้องการ เพิ่ม(setq magit-diff-refine-hunk t) หรือ (setq magit-diff-refine-hunk 'all)ไปยังไฟล์ init ของคุณ คุณสามารถทำได้C-h v magit-diff-refine-hunk RETเพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับความหมายของการตั้งค่าต่างๆ
itsjeyd

คุณจะต้องทดลองใช้การตั้งค่า magit-diff-refine-hunk เพื่อให้เข้าใกล้สิ่งที่คุณต้องการมากขึ้น การตั้งค่าเริ่มต้นนั้นยอดเยี่ยมสำหรับการเปลี่ยนแปลงรหัสติดตาม แต่ไม่จำเป็นต้องฉลาดเมื่อคุณต้องการติดตามการเปลี่ยนแปลงในมืออาชีพ อาจใช้เวลาสักครู่ก่อนที่จะทำให้ถูกต้อง แต่ควรเป็นไปได้และเมื่อคุณทำฉันสงสัยว่าคุณจะไม่กลับไป!
ทิม X

11

นอกจากmagit((ตามคำตอบของ @ @ itjeyd แสดงให้เห็นด้วยความสามารถ) คุณยังสามารถลองgit-timemachineซึ่งมีสิ่งอำนวยความสะดวกสำหรับการปั่นอย่างรวดเร็วผ่านไฟล์gitเวอร์ชันเก่าภายใต้การควบคุมเวอร์ชัน จากหน้า GitHub คีย์บิทเริ่มต้นต่อไปนี้ให้ความรู้สึกว่าคุณสามารถทำอะไรได้บ้าง:

  • p เยี่ยมชมเวอร์ชันประวัติศาสตร์ก่อนหน้า
  • n เยี่ยมชมรุ่นประวัติศาสตร์ต่อไป
  • w คัดลอกแฮชตัวย่อของเวอร์ชันประวัติศาสตร์ปัจจุบัน
  • W คัดลอกแฮชแบบเต็มของเวอร์ชันประวัติศาสตร์ปัจจุบัน
  • q ออกจากไทม์แมชชีน

8

ฉันสงสัยว่าคุณจะพบโหมดสำรองและ / หรือสำรองวอล์คเกอร์น่าสนใจมาก

ทั้งคู่ตั้งเป้าที่จะใช้ประโยชน์จากกลไกการสำรองข้อมูลที่มีอยู่ใน Emacs และให้การเข้าถึงที่ดีขึ้นและการมองเห็นประวัติไฟล์ของคุณโดยไม่ต้องใช้ VCS เพิ่มเติม


6

วิธีที่ง่ายต่อการมีไฟล์เวอร์ชั่นต่าง ๆ คือระบบสำรองข้อมูลของ Emacs

(setq backup-directory-alist '(("." . "~/emacs-backups"))
      version-control 'numbered
      make-backup-files t
      delete-old-versions 'never)

นี่จะใช้ไดเรกทอรีเฉพาะสำหรับการสำรองข้อมูลที่มีหมายเลขซึ่งจะไม่ถูกลบโดยอัตโนมัติ จากนั้นคุณสามารถใช้C-u C-x C-sเพื่อสร้างเวอร์ชันอื่นได้ตลอดเวลา

แม้ว่าฉันคิดว่าไม่มีเรื่องง่ายและพร้อมใช้งานอินเทอร์เฟซสำหรับเช่น diffing รุ่นเหล่านี้ ดังนั้นคุณต้องเปิดหนึ่งหรือสองของการสำรองข้อมูลเหล่านั้นด้วยตนเองและใช้ediff-buffersกับพวกเขาและ / หรือบัฟเฟอร์เดิม


1
คุณสามารถกระจายการสำรองข้อมูลโดยใช้ตัวอย่างเช่น: gnu.org/software/emacs/manual/html_node/emacs/ … (ทำเครื่องหมายที่ไฟล์เดียวด้วยmจุดย้ายไปยังไฟล์อื่นแล้วกด=)
wvxvw

2
นี่เป็นตัวเลือกที่น่าสนใจในทางทฤษฎี แต่มันทำให้ฉันมีโฟลเดอร์ที่เต็มไปด้วยการสำรองข้อมูลแบบสุ่ม รุ่นที่ฉันสนใจถูกฝังอย่างสมบูรณ์ อาจมีวิธีที่จะทริกเกอร์การสำรองข้อมูลหมายเลขไฟล์ด้วยตนเอง แต่เมื่อฉันต้องการหรือไม่ หากฉันยังสามารถแนบ "ส่งข้อความ" สั้น ๆ ไปยังการสำรองข้อมูลได้อย่างใดอย่างหนึ่งนี่จะเป็นทางออกที่ดีมาก แต่ตอนนี้ผมคิดว่าผม magit การเรียนรู้ติด :)
ไบรอัน Z

2

ฉันยังไม่ได้มีโอกาสที่จะใช้วิธีการแก้ปัญหานี้ แต่คุณอาจต้องการที่จะต้องพิจารณาคคอรีและโทมัสกิเดโอนflashbake นี่คือสิ่งที่ Doctorow พูดถึง :

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

เข้าสู่ Flashbake ทุก ๆ 15 นาที Flashbake จะดูไฟล์ใด ๆ ที่คุณขอให้ตรวจสอบ (ฉันได้ดูที่เรื่องที่กำลังดำเนินการทั้งหมดรายการสิ่งที่ต้องทำของฉันไฟล์ข้อมูลที่มีประโยชน์และหนังสืออิเล็กทรอนิกส์ฉบับล่าสุดที่สมบูรณ์ ) และบันทึกการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นนับตั้งแต่การตรวจสอบครั้งล่าสุดและใส่คำอธิบายประกอบกับเขตเวลาปัจจุบันบนนาฬิการะบบสภาพอากาศในเขตเวลานั้นมาจาก Google และพาดหัวข่าวสามบรรทัดสุดท้ายกับบรรทัดย่อยของพวกเขาใน RSS บล็อกของคุณ ฟีด (ฉันเคยอธิบายลักษณะนี้ว่า "ฉันอยู่ที่ไหนฉันชอบอะไรและฉันกำลังคิดอะไรอยู่") นอกจากนี้ยังบันทึกสถานะการออนไลน์ของคอมพิวเตอร์ของคุณ สำหรับรุ่นในอนาคตฉันคิดว่ามันคงจะสนุกที่ได้เล่นเพลงสามเพลงล่าสุดโดยเครื่องเล่นเพลงของคุณ

ที่ถูกกล่าวว่าฉันไม่เคยมีโอกาสที่จะทดสอบออกตั้งแต่ผมจบลงด้วยการเขียนจำนวนมากของสิ่งที่อยู่ในองค์กรโหมดและการเขียนโปรแกรมมากและ ... ดี ... ชนิดของฉันได้ดีกว่าที่ใช้magit, และในที่สุดฉันก็แค่ ... ไม่จำเป็นต้องใช้มัน

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


1

แม้ว่ามันจะไม่เกี่ยวข้องกันอย่างสมบูรณ์emacsคุณยังสามารถบันทึกไฟล์ข้อความของคุณลงใน Dropbox และหากคุณเป็นผู้ใช้มืออาชีพคุณสามารถใช้ประวัติเวอร์ชันเพิ่มเติมได้ (ถ้าคุณต้องการเข้ารหัสคุณอาจต้องการดูSparkleShare )

จากนั้นมีflashbakeซึ่งเป็นบิตอัตโนมัติ ( นี่คือการสอน )

มันก็ถูกถาม ที่อื่น ด้วยซึ่งคำตอบที่คุณอาจพบว่ามีประโยชน์


Flashbake ดูมีแนวโน้มมาก ฉันจะลองทำดู
Brian Z

-1

คุณสามารถใช้ Dropbox มันทำให้เวอร์ชันของไฟล์ที่แก้ไขได้ของคุณทุกครั้งที่คุณกด Cx C สำหรับการเข้ารหัสไฟล์ข้อความของฉันฉันใช้ GNU Privacy Guard โดย Emacs รองรับ

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