是否有适用于用Emacs编写非编码器的简化版本控制系统?


28

我是一名学者,我喜欢在Emacs中尽可能多地写作。我缺少的一项关键功能是能够轻松查看随着时间的推移对文本文件所做的更改。

Wikipedia文章或Google Documents上的跟踪功能都符合我的需求。我玩过git之类的版本控制系统,是因为Emacs似乎很好地支持了它们,但是我发现它们很难使用,而且比我需要的更加复杂。注册存储库,签入和签出,这只是麻烦。

我不认为有任何软件包可以相对用户友好的方式提供我正在寻找的功能吗?


3
我建议使用gitmagit- github.com/magit/magit -因为你已经与它周围的一点点播放。您可能需要熟悉命令行选项,以便对执行的操作有更好的了解magit。Emacs 不适用于非编码人员,但是您已经在现场了很长时间,不怕它-:)您可能还想尝试使用gistgithub.com/defunkt/gist.el
lawlist

从技术上讲,vc-命令组的目标是简化使用VCS的过程。不幸的是,它们没有让没有经验的用户充分利用它们的直观性。另一方面,您提到的系统非常有限,因此人们很快就会开发出无法满足的需求。gnu.org/software/emacs/manual/html_node/emacs/…保留备份的机制很简单,但是由于上述原因,我宁愿建议学习使用一些VCS。
wvxvw 2015年

6
我也是一名学者,已经开始使用git/ magit进行论文的版本控制。它看起来很吓人,但a)您不必一次学习所有内容,b)克服了最初的学习曲线后,使用起来很愉快。良好的工作流程还可以帮助您规范写作任务,因为它可以鼓励您注释自己的工作-这是获取写作项目发展时间表的好方法。

您在什么操作系统上?我使用RCS已有多年,之前使用SCCS,但后来开始不再与OS捆绑在一起,最近又改用git,因为有些论文正在颠覆。与RCS相比,git中的签入过程还有一个额外的步骤,但是在许多情况下,将多组文件一起签入非常有用。
Andrew Swann 2015年

这一直在我的脑海,并自动提交可能是故事的一部分:自动提交到git的每次保存后 projects.ryuslash.org/git-auto-commit-mode
grettke

Answers:


43

现有版本控制系统的问题不仅仅是它们的复杂性;事实是,那里的信息如此丰​​富,以至于初学者很难看到树木茂盛的树木(即,弄清楚他们做什么,不需要在刚开始时学习) )。

这篇文章将重点介绍git并描述如何使用名为的附加软件包从Emacs控制它magit是的git很复杂,但是您无需学习太多内容即可有效地用于您描述的目的。

我将假设您已git安装(如果未安装,请在此处下载),并且您根本不想离开Emacs。


正在安装 magit

magitgitEmacs 的前端。它可以从MELPA获得,您可以通过以下方式安装:

M-x package-install RET magit RET

如果您尚未在配置中启用MELPA,则可以在此处找到有关操作方法的说明。

建立资料库

假设~/writing您的主目录中有一个文件夹,其中包含一个或多个您希望置于版本控制下的文档。

  1. 在Dired中打开文件夹: C-x d ~/writing RET
  2. 打开外壳: M-x shell RET
  3. 输入git init并点击RET

而已。您现在有了一个git存储库。无需在任何地方“注册”它。git是一个分布式版本控制系统;它不需要远程服务器来跟踪更改。

检查您的存储库状态

  1. 切换回Dired缓冲区,该缓冲区列出了存储库中的文件。
  2. M-x magit-status RET

您可以将缓冲区视为用于存储库的“控制面板”。对于新的存储库,它看起来像这样:

新创建存储库的Magit状态缓冲区

  • 您可以使用nmagit-goto-next-section)和pmagit-goto-previous-section)在此缓冲区的不同部分之间导航。

  • 您可以按gmagit-refresh)刷新缓冲区。

请注意,您可以从属于您之前设置的存储库的任何文件或目录中启动状态缓冲区。

添加文件

从屏幕快照中可以看到,存储库中有三个git当前未跟踪的文件。要告诉git您开始跟踪文件,需要分阶段进行:在要添加的文件上指向,按s。状态缓冲区将如下所示:

添加文件1.txt后的Magit状态缓冲区

提交中

暂存一个或多个文件后,可以按提交它们c c。这将弹出一个如下所示的缓冲区:

Magit缓冲区,用于输入提交消息

在顶部输入您的提交消息,然后按C-c C-c完成提交。(要中止,请按C-c C-k。)

状态缓冲区将如下所示:

首次提交后的Magit状态缓冲区

分期变更

如果您对跟踪的文件进行更改,它们将在状态缓冲区的单独部分(“未暂存的更改”)中列出:

未分段的更改(已折叠)

要查看对文件所做的更改,请导航至显示的行,Modified file-1.txt然后按TAB

未分段的更改(已扩展)

要进行这些更改,请按s

分阶段更改跟踪文件后的Magit状态缓冲区

查看过去的提交

最后,如果您想查看过去的提交,则可以按l l(这是两个小写的L):

Magit日志缓冲区

与往常一样,您可以浏览n和附带的缓冲区p。Magit将在单独的窗口中显示与此缓冲区中列出的各个提交相关的更改。

摘要

从外壳:

  • 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在任何git仓库之外的地方调用它,它将提供一个设置。(但是,完成设置后,您将需要再次调用它以调出状态缓冲区)。
wvxvw 2015年

您已经说服我值得再次尝试版本控制,这应该是有用的指南。谢谢!
Brian Z

1
到目前为止,还算不错,但令人沮丧的是,当我在一个较长的段落中更改几个单词时,整个段落都被突出显示为阶段性更改。我真的很想看到逐字而不是逐行的更改。
布赖恩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(如@itsjeyd的回答清楚地说明的那样),您还可以尝试使用git-timemachine,它提供了在git版本控制下快速循环浏览旧版本文件的功能。根据其github页面,以下默认键绑定使您对可以执行的操作有所了解:

  • p 访问以前的历史版本
  • n 访问下一个历史版本
  • w 复制当前历史版本的缩写哈希
  • W 复制当前历史版本的完整哈希
  • q 退出时间机器。

8

我怀疑您会发现Backups ModeBackup Walker非常有趣。

两者都旨在利用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随时制作另一个版本。

但是,我认为,尚无易于使用的界面来例如区分这些版本。因此,您必须手动打开其中一个或两个备份,然后ediff-buffers在它们和/或原始缓冲区上使用。


1
您可以使用,例如:gnu.org/software/emacs/manual/html_node/emacs/…(将一个文件的m移动点标记为另一个文件,然后按=)来比较备份。
wvxvw 2015年

2
从理论上讲,这似乎是一个有吸引力的选择,但它给了我一个不计其数的文件夹,里面充满了随机备份。我感兴趣的版本已完全埋没。也许有一种方法可以手动触发文件的编号备份,但是仅在需要时才触发?如果我还可以通过某种方式将简短的“提交消息”附加到该备份,那么这将是一个非常好的解决方案。但就目前而言,我想我仍在学习magit :)
Brian Z

2

我尚未有机会使用此解决方案,但您可能还需要考虑Cory Doctorow和Thomas Gideon的 flashbake。这是Doctorow必须说的

在与数位数字档案管理员进行讨论之后,我被提示这样做,他们抱怨说,在计算机时代之前,作家就出版的方式制作了一系列完整的草稿,包括删节,注释等。这些是归档性的黄金,因为它们以经常揭示我们所关注的书籍背后隐藏故事的方式阐明了创作过程。相比之下,许多作者只产生一个(或几个)数字文件,这些文件直到出版时才被修改,而没有任何系统的真实记录来记录撰写的第一部分和最终草案之间的过渡状态。

输入Flashbake。每隔15分钟,Flashbake会检查您要检查的任何文件(我会查看所有进行中的小说,待办事项列表,有用的信息文件以及最新书籍的完整电子版) ),并记录自上次检查以来所做的任何更改,并在系统时钟上标出当前时区,从Google获取的该时区的天气,并在博客的RSS中用最后一行标题标出最后三个标题。 feed(我一直将其描述为“我在哪里,那里的感觉如何,我在想什么?”)。它还会记录您计算机的正常运行时间。对于未来的版本,我认为音乐播放器播放最近的三首歌曲会很有趣。

话虽这么说,但我最终没有以组织模式进行测试的机会,因为我最终在组织模式下编写了很多东西,并且编写了很多程序,而且...嗯...我在使用方面有所进步magit,最后,我只是...不需要使用它。

无论如何,该解决方案都是针对从事非技术项目的作者的。您可能会发现它可能符合您的要求。



-1

您可以使用Dropbox。每次按Cx Cs时,它都会使文件的版本可修改。为了对我的文本文件进行加密,我使用了Emacs支持的GNU Privacy Guard。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.