纯文本文档的简单版本控制 (Linux)

软件推荐 免费 linux 文件管理 版本控制 纯文本
2021-10-27 22:33:51

我想为纯文本文档确定一个简单的 FOSS 版本控制系统。

对于更复杂的(学术)写作,我很乐意使用 LibreOffice。但我越来越发现在 Markdown 中编写更简单的文档(报告、演示文稿、讲座、笔记等)很方便,通常使用ReText

我现在的目标是管理这些文档的版本。一个场景可能是:起草一个演示文稿 --> 在事件 A 上交付的“完成”版本 --> 现在重新起草 --> 在事件 B 上交付 --> 现在出现事件 C,事件 A 版本是更好的版本--> 为赛事 C 拉动并起草。

所以,我的要求是:

  • 版本控制(显然是必不可少的!)
  • Ubuntu/Mint 友好(PPA 会很棒)
  • 轻松标记/评论/标记“提交”
  • 简单的标签/标签浏览
  • 简单的标签/标签搜索
  • 以前版本的简单“恢复”
  • 做差异的可能性
  • 同步到不同机器的可能性
  • 文档的简单目录结构/层次结构

我知道的一个明显的解决方案是使用Git 来管理版本控制(以及网络上的许多其他文章)。我并不完全反对,并且已经从 Windows 和 Linux(Ubuntu、Mint)随便使用了几年的 Github。那里的关键词是“随便”——这似乎有点像大锤到坚果的场景。

(我也看到过关于“无纸化办公室文档管理器”的问题,但这似乎远远超出了我的需要。)

很可能还有其他选择,当然也会有我从未听说过的工具。感谢您对此提供的任何帮助。

4个回答

是的,您应该使用git*.

现在让我解释一下原因。鉴于您问题中当前(相当模糊)的一组标准,答案似乎相当明显。如果你知道更多,你甚至不会问这个问题。你已经把自己带到了悬崖的边缘,现在你只需要哄着跳就行了。

* 或 Fossil、Mercurial、Darcs、Bazaar 或其他 DVCS,具体取决于您喜欢的前端工具,待解释。

当前场景和一些历史:

基本上有三种版本控制系统:distributedham-fistedtapped-out请允许我扩展该技术术语以及每个术语是如何产生的以及如何适用于您的情况。

  • 笨手笨脚的

    值得注意的条目*:CVS、Subversion。

    在 DVCS 系统风靡全球之前,就有了 VCS 系统。这些可以通过中央存储库/服务器和用户工作空间/客户端的星形模式来表征。这些是一个不可或缺的宝贵工具,可以让一组程序员保持在同一页面上,甚至使自己适应其他用途。一个程序员可以在多个系统上工作,并使用分支和标签。他们节省了很多一天。但他们天生笨拙。他们使一些简单的任务变得更加困难首先是设置它们的开销,需要服务器和特定的协议来连接它们。然后是处理那些你做错事的痛苦。可以说这些可以为您的用例完成工作,但会引入权衡取舍,使生活变得更加复杂。

  • 出线

    值得注意的条目:RCS。

    因为当涉及服务器和客户端以及身份验证以及所有爵士乐的“成熟”系统难以接受时,可以使用一个生活在自己的小泡泡中的精简系统。RCS 通过避开存储库的想法并一次只对一个文件进行版本控制来做到这一点。你有file.txt并且坐在它旁边file.txt,v有版本历史。您可以在每个文件的基础上轻松实例化它,并使用一些简单的工具来处理差异、回滚时间等。

    现在,在您说“啊哈,这正是我想要的!”之前,请继续阅读,因为这不再是最简单或推荐的方法了。轻松进入是以较低的运营上限为代价的,这几乎可以保证迟早会限制您的风格。

  • 分散式

    在某个时候,一群聪明的程序员认为他们已经受够了痛苦,并说:“我们要吃蛋糕,也要吃蛋糕。” 令人惊讶的是,他们成功了,分布式版本控制系统诞生了。这些系统结合了两全其美的优点——完整的版本历史记录位于您的本地系统上,紧邻原始文件,并且能够共享您的历史记录并与其他远程存储库的历史记录进行交互。事实证明,这样做没有严重的技术缺点。

    对一些商店来说,最大的障碍是灵活性。由于系统不会对您的工作方式施加任意限制,因此从强制您拥有特定工作流程的系统迁移有时会很痛苦。突然之间,您必须考虑一下您希望系统如何工作。许多过去需要的东西(中央节点总是有每个人的最新东西)变成了一个只有在需要时才使用的事情约定,但你必须坐下来说:“这就是我们将如何使用这个工具的方式。”

所以让我们坐下来谈谈将如何使用这个工具。

出于这个答案的目的,我将坚持使用 git,因为它是最广泛采用的系统之一。它很容易在大多数系统上安装(如果尚未安装),并且有大量可用的文档涵盖几乎所有用例。它也是可扩展的,并且被许多第三方系统等认可。话虽如此,它不一定比它最近的竞争对手 Bazaar 或 Mercurial 在本质上更好。

  • 如果你生活在一个 Ubuntu 生态系统中,你可能想看看 Bazaar,因为 Canonical 将它用于一切,它会很好地与你的环境集成。他们的启动板服务类似于 Github,但为 Ubuntu 软件开发量身定制。如果你打算在那个生态系统中玩,考虑学习bzr而不是 git,这样一个工具既适用于你的个人世界,也适用于你参与的生态系统。如果你不从事在启动板上协调的项目,我建议使用 git。

  • 如果您的任何同事对 Mercurial 很感兴趣,您可能想考虑使用它。它是一个非常强大的 DVCS,与 Git 相比具有一些优势。由于更简化的数据流,它经常被认为对某些操作更快。这些工具都封装在一个二进制文件中,而不是像 Git 那样从一堆单独的(有时是冗余的)工具中拼凑在一起。它可以使用 Python 绑定进行扩展,并且可以构建与之紧密集成的外部系统。该范例与 Git 非常相似,一旦您学习了它,您也可以在 git 存储库中犯错。最后,git 是目前该领域最受欢迎的玩家,坚持使用它会让您在需要时更容易获得帮助。

* 我对所有未命名的 VCS 系统表示歉意。CVSNT、CA、CC、Perforce、Plastic、PVCS、Star、SVK、Vault、Vesta、VSS 等等。你的名字永远不会被遗忘,已经只是记忆。

如何git适合您的用例:

你提到过使用 Github 一点。这很好,但你需要记住Github 不是 git一种常见的误解是,他们提供的是一种通过为您托管存储库来进入系统的免费方式。实际上,他们提供的是在 git 之上构建的一个层,该层部分是社交网络,部分是项目管理。这对开源社区来说是一件好事。他们没有试图成为替代系统并与市场抗争,而是出色地利用了一个好的工具,开辟了一个市场,为企业提供增值服务,同时为社区服务。但是 Github 不是 git。

事实上,Git 可以以更简单的方式使用。

与 RCS 类似,git 将版本信息存储在本地内容旁边。门外的显着区别是它基于每个目录而不是每个文件执行此操作。

  • RC:

      file1.txt
      file1.txt,v
      file2.txt
      file2.txt,v
    

    ,v每个文件的文件都保留一个文件历史的运行列表,存储每个连续版本之间的增量

  • 混帐:

       directory
       + file1.txt
       + file2.txt
       + .git
         + glob1
         + glob2
    

    .git 文件夹中的东西实际上有时髦的名字并且有点复杂,但你不需要知道它。从概念上讲,它所做的只是将不同版本之间的差异存储在您的目录中。基本上,每个 glob 都是您的目录在每次提交时的样子的图像。许多花哨的数学可以降低开销,以便只保存增量数据。

现在这听起来可能已经很复杂了,但你真的不需要知道这些。该工具集会为您跟踪所有花哨的东西。基本用法与 RCS 一样简单,但为您提供了成长空间。

入门会是这样的:

# Change to the directory that has files you want to version.
cd ~/pathto/yourtextfiles

# Initialize git to keep track of that folder
git init

完毕。不需要服务器。只有您和您的版本控制文件。除非您还没有任何文件受到监视,所以 git 实际上并没有在看任何东西。从某种意义上说,Git 并不贪婪,它不会跟踪文件夹中的所有内容,只会跟踪您告诉它的特定内容。因此,下一步是告诉它您要跟踪哪些文件。

# Add some files to the system, assuming these already exist the your dir
git add file1.txt file2.txt

# Commit the changes you just made
git commit -m "initial add"

请注意,与大多数系统不同,这是一个两步过程。在您提交内容并将它们作为新版本填充到存储库中之前,您必须“暂存”它们。并非您对工作目录所做的每项更改都会自动假定为您希望在每次提交时保存的内容。也许您更改了两个文件,但只想标记一个。

# Edit a bunch of files
vim file1.txt
vim file2.txt
vim file3.txt

# Only mark one of them as going it your next commit
git add file2.txt

# Commit it to history
git commit -m "fixed typo"

请注意,对 file1.txt 的更改尚未保存到存储库,并且根本未跟踪 file3.txt。通过运行,您可以看到以前跟踪的文件有未暂存的更改,git status以及这些更改是什么git diff此时状态会告诉您您已对 file1.txt 进行了更改,并且您的目录中有一个未跟踪的 file3.txt。Diff 将向您显示自上次暂存和提交以来您对 file1.txt 所做的更改。

一个“陷阱”,你应该被警告开始,这样它就不会咬你的路是 - 因为 git 的存储库的概念是一个完整的目录,对文件的更改被视为该目录的图像时间点——您应该考虑为不同的项目建立单独的存储库。与其从“我的文档”中创建单个存储库,不如从包含文档的某些有意义子集的目录中创建单独的存储库,无论是按主题、按格式还是按项目或其他。当您想在另一台机器上处理“与 x 相关的所有文档”时,这将使您在以后更轻松,而不必拥有您在该机器上创建的每个文档。Git不允许您要检查存储库的子树*,它要么全部要么全无,因此错误地为密切相关的数据集创建许多粒度存储库,每个目录一个。

实际上,这就是基本用法的全部内容。从那里开始,几乎所有你能想象到的事情都是可能的,但那时你会问一个使用问题,而不是一个软件推荐问题。

* 例如,Subversion 确实允许这样做,我已经习惯了。当我认为 git 会允许类似的事情时,这让我很早就想到了。我在一个大型 svn 存储库中拥有我所有的个人文件,并且天真地认为 git 会替代它。吸取的教训,我的文件最好被分类。

但是命令提示符很可怕!

当然,有许多前端 GUI 可让您远离命令行并直观地表示文件正在发生的事情。其中许多具有 IDE 风格,可以作为您进入文档管理的入口点,使用它们来启动您最喜欢的编辑器*,甚至使用内置编辑器。由于您询问了后端文件应如何存储的问题,因此我建议将其git用作版本管理器,但如果您想从前端的角度来看这应该如何看待和工作,您应该问这是一个单独的问题。

* 当然gvim很适合这个用例 ;-)

综上所述:

进来吧,水很好!

一!二!三! git init

看到这并不难。

在这种情况下,我建议使用https://draftin.com/,请参阅此处以快速了解您可能希望使用的特定功能。

在详细回答您的问题之前,我想指出该软件的一个缺点是它旨在在线使用。可以在没有 Internet 连接的情况下使用草稿(请参阅此处),但它仍然需要完善 - 同步,这是草稿中的一个基本功能,仍然必须在离线之前手动触发。

  1. 版本控制:的,当然。它是草稿中的核心功能,它很棒,因为当您不想看到它时它不会妨碍您,但是每次您或与您分享您的作品的任何人-混乱时,它都会为您服务跟上文件。(默认情况下,其他人的编辑不包含在您的文档版本中,您必须先接受它们。)

  2. Ubuntu/Mint 友好:的,毕竟它是一个网站。任何 decend 浏览器都可以解决问题,我只在 chromium 上测试了离线功能,它有一个适用于 Ubuntu 的 PPA。

  3. 易于标记/评论/标签:关键是草稿应该为您处理这个问题,允许您标记文档的主要和次要版本,并明确谁进行了编辑。在这一点上,草稿对你来说不是最好的工具。

  4. 简单的标签/标签浏览、搜索:不确定好吧,如果为您设置的标签草稿至少满足您的需求。

  5. 以前版本的简单“恢复”:您不仅可以恢复以前的版本,还可以保留两个版本中的有用位,并在查看与任何其他版本的差异时编辑当前版本。

  6. 做差异的可能性:的。事情有时会出错(最烦人的情况是在重写段落时:draftin 认为我用新句子替换每个句子,在差异中混合旧的和新的,当我希望新段落与旧的,但颜色代码使其处理起来不那么可怕。)但是,差异工作正常。

  7. 同步到不同机器的可能性:的,由于事物的网页性质。不过,离线模式很奇怪,需要手动同步。

  8. 文档的简单目录结构/层次结构:是的,但是,甚至有点太简单了。您可以将文档放在文件夹中,但我还没有找到嵌套文件夹的方法,这是一个很大的缺点。

总而言之,草稿将它的方式强加给用户,如果你喜欢它就很酷(我喜欢它)。在您的情况下,它确实值得一试,但它的灵活性非常低(如果您正在编码,它确实提供了一个 API)可能会限制它的范围。

使用“化石

@Caleb 的超赞作品(上图)在他发布多年后仍然有意义且引人入胜的阅读。

然而,为了得到一个我喜欢的系统已经工作了七年,我在Fossil中找到了它。它在 SoftwareRecs 中出现过一次两次,但往往在雷达 (IMO) 下飞行。

对于这个用户,Fossil 回答了 Caleb 记录的关于基于 Git 的系统的所有好处,并为我的大脑/工作“习惯”增加了一些好处。它很好地回答了我原来的用例/标准(当然):

  • 是的版本控制(显然是必不可少的!)
  • 是的Ubuntu/Mint 友好(PPA 会很棒)| 但不需要 PPA!
  • 是的轻松标记/评论/标记“提交”
  • 是的简单的标签/标签浏览
  • 是的简单的标签/标签搜索
  • 是的以前版本的简单“恢复”
  • 是的做差异的可能性
  • 是的同步到不同机器的可能性
  • 是的文档的简单目录结构/层次结构

额外的好处

对我来说基本上有两个好处——(nb 有经验的 Git 用户不会对这些印象深刻):

  1. Fossil 很容易 自托管Git可能也是如此,但在我看来,Fossil 可以比 Git 更简单地自托管。<shrug/>尽管这不是我最初发布的基本标准之一,但我已经开始支持这种方法(即不依赖第三方服务)。
  2. 虽然这些过程与 Git 非常相似,但 Fossil 的方法(再次)在我看来更加精简(或简单),因此我多年来在使用 Git 时所经历的一些焦虑(就像我一样)是没问题。
  3. 奖金!跨平台使用也非常简单(我经常在 Ubuntu 和 MacOS 之间切换);同样,Git 当然也可以在任何平台上使用,但在非 Linux 系统上,Git 的入门门槛似乎比 Fossil 高一些。
  4. 奖金2!Fossil被描述为“GitHub-in-a-box”,因为它的单个可执行文件(易于安装在 Win/MacOS/*nix 系统中)不仅包括版本控制,还包括问题跟踪、wiki、论坛、“聊天“类似设施,以及内置的 Web 前端……多合一。欢乐!(并不是说需要使用这些额外的功能,但它们的存在并不需要额外的费用。)

Caleb 的(当然!)关于 Fossil(以及其他人)的半开玩笑的评论(“你的名字永远不会被遗忘已经只是一个记忆。”)对于 Fossil 来说不太可能......它是管理 SQLite 开发的原因,所以不会很快消失!:)

git 是很好的版本控制解决方案。明文专用。

  • 研究 ReText 中集成的版本控制系统支持。(我找不到)
  • 试试 git 前端。我喜欢吉特可乐。
  • 尝试外部差异/合并工具。我喜欢梅尔德。