版本控制 не только для программистов

还没有读者喜欢这篇文章。
Open art versioning

Opensource.com

与其他的艺术家和创意人员合作时,当我查看他们的项目目录时,我总是感到惊讶,坦率地说,还有点震惊。他们目录中的文件经常以相同的名称开头,但后缀却用数字编号,例如-v1-v2-v3-FINAL-v3-FINAL3v3-FINAL3-real-v3-FINAL5-please_will_it_ever_end等等。

更令人惊讶的是,这些艺术家经常参与协作项目,其中多人可能会接触到同一个文件(或一组文件),而且通常持续很长时间。我经常问这些艺术家:“你们有没有考虑过为你们的项目使用任何类型的版本控制?”

我总是得到这样的回答:“什么是版本控制?”

对艺术家来说,什么是版本控制?

我们生活在一个现代社会,拥有这些神奇的电脑,它们本应帮助我们提高效率。为什么我们中的这么多人仍然通过在文件名末尾添加数字和字母的序列来“版本化”我们的文件呢?

软件开发领域的朋友们已经多次以各种有趣的方式解决了这个问题。简而言之,版本控制最容易与视频游戏中的“保存状态”相比较。当你对自己的进度感到满意时,你就可以创建一个保存状态(在版本控制术语中称为提交)。从那里,你可以继续沿着当前的路径前进,或者通过检出一个不同的路径(一个分支)来测试一个想法。无论你选择哪条路,你都可以随时回到任何之前的提交,并从那里重新开始。令人困惑的是,这些工具在创作内容的人们中还没有得到更广泛的应用。为此,我将简要介绍一下我多年来一直使用 Mercurial 的方法。

Mercurial

任何已经了解版本控制软件 (VCS) 的人提出的第一个问题可能是:“你为什么要选择 Mercurial?” 确实,在开源和闭源生态系统中都有各种各样的其他工具。仅在开源方面,就有 Subversion、Fossil(它有一个内置的 wiki!)、Bazaar,以及——可以说是最流行的 VCS——Git。在专有方面,有 Perforce 和 Alienbrain 等产品。甚至 Dropbox 也允许你回滚到文件的早期保存版本。那么,为什么要选择 Mercurial 呢?

这是一个个人决定,所以我相信其他人可能会选择不同的工具。但是,以下是我选择 Mercurial 的原因的快速概述

  • 它不需要 централизованного сервера. Mercurial 是一种分布式版本控制系统 (DVCS)。 除此之外,这意味着所有版本控制都可以在你的本地计算机上完成。 因此,与 Subversion 甚至 Dropbox 不同,你不依赖于设置单独的服务器来存储项目文件的版本历史记录。
  • 它是跨平台的。 可惜的是,并非所有与我合作的其他艺术家和创意人员都在开源操作系统上。 虽然大多数其他 DVCS 程序都有带有命令行界面的端口,但 Mercurial 在 TortoiseHg 中有一个非常成熟的图形前端。 我建议人们对 Mercurial 的命令行有一个很好的理解,但许多艺术家确实欣赏良好的点击界面……而且 TortoiseHg 中的历史视图非常令人愉快。
  • 它具有简单、易于理解的工作流程。 Mercurial 没有 Git 那样流行或几乎普及。 然而,至少对我而言,工作流程更加直接。 对于大多数创意人员所做的那种工作,诸如暂存区和历史可变性之类的功能往往不值得额外的程序开销。 记住要使用有意义的提交消息显式提交(别担心,我们很快就会介绍)已经比许多创意人员愿意付出的努力更多了。 暂存文件,或者在 Fossil 的情况下,确保存储库数据库是打开的,这都超出了我们想要(或需要)考虑的范围。

还有一些传闻证据表明,Mercurial 可能更有效地处理二进制文件(例如图像和其他媒体文件,这是大多数创意工作的支柱)。 此外,我读过的关于分布式版本控制的最佳入门读物之一(Joel Spolky 的 Hg Init)是专注于 Mercurial 编写的。 当然,几乎所有版本控制系统不一定都旨在支持创意制作中常见的文件类型(大型二进制文件),并且有一些系统专门用于此目的(称为数字资产管理软件或 DAM)。 然而,在我看来,它们往往过于特定于特定的媒介或工作流程风格。

这就是我个人选择 Mercurial 的原因。 也就是说,我将在此处描述的大多数其他系统中都有一个类似的过程。 因此,如果你更喜欢使用 Git 或 Fossil,我认为这很棒。 至少你在使用一些东西。 这让你比大多数其他创意人员领先一步。

开始之前

我将 Mercurial 和 TortoiseHg 的安装过程留给他们的 文档 和你对自身操作系统的理解。 但是,在创建你的第一个项目存储库之前,必须执行一个配置步骤。 你需要标识自己。 请记住,Mercurial 是一个分布式版本控制系统,旨在允许多人团队在同一个项目上进行协作。 当你进行协作时,你需要一定程度的责任制。 你需要知道是谁做了什么更改。 这样,你就可以单独联系该人以获得有关更改的更多说明。

设置你的身份非常容易。 从终端窗口,你可以键入 hg config -e。 这将弹出一个文本编辑器,其中包含你的 Mercurial 配置文件(通常是你的主目录中的 .hgrchgrc)。 在该文本文件中,输入以下内容(或者如果它已经在那里,则编辑它)

[ui]
username = Your Name 

保存并关闭文件,你就设置好了。 当然,有一种图形方式可以从 TortoiseHg 执行此操作(文件设置全局设置提交),但正如我所说,我建议你了解它在命令行中是如何工作的。 这会让你在图形界面中工作时更有效率。

Mercurial 入门

好的,说了这么多,如何开始使用版本控制呢? 好吧,第一步是创建你的存储库。 存储库(简称“repo”)是存储(和版本化)你的项目的所有相关文件的地方。 虽然可以拥有一个分解为多个子存储库的单个主存储库,但推荐的做法是为你处理的每个项目设置一个单独的存储库。 我对此的唯一例外是针对小型、单文件项目。 例如,我为我的所有 Opensource.com 文章保留一个存储库,因为每篇文章只有一个文件。

要启动你的存储库(或初始化它),这个过程很像启动任何大型项目。 首先为项目创建一个目录。 然后你进入该目录并初始化你的存储库。 从命令行来看,步骤如下所示

$ mkdir myproject
$ cd myproject
$ hg init

最后一条命令 hg init 是 Mercurial 命令(所有 Mercurial 命令都以 hg 开头;Hg 是汞的化学符号),它初始化你的存储库。 如果你从 TortoiseHg 执行此操作,请转到文件新建存储库,并使用弹出对话框选择项目目录的路径。 然后它会为你运行 hg init 命令。

当然,如果你实际上没有任何项目文件在其中,那么仅仅拥有存储库对你没有多大好处。 不幸的是(但有充分的理由),它不像在存储库目录中复制或创建文件那么简单。 它不是自动的。 你希望 Mercurial 跟踪(即,保留版本)的任何文件都需要显式添加到存储库。 从命令行(假设你仍然在你的项目目录中)

$ hg add totally_sweet_painting.ora

这让 Mercurial 知道你希望它跟踪对你的文件的更改——在本例中是 totally_sweet_painting.ora。 在 TortoiseHg 中,你可以从左下方面板执行此操作。 你应该在其中看到你的文件,左侧有一个复选框和一个问号。 你可以右键单击文件名,然后从出现的上下文菜单中选择添加

Mercurial 现在知道要跟踪你文件上的更改,但它还不知道是否实际进行了任何更改。 你需要显式地提交你的更改和更新到存储库。 并且在提交时,你需要包含一个注释或消息,描述你所做的更改。 这似乎是不必要的麻烦,但相信我,当你几个月后(或者,就我而言,是第二天)回到你的项目时,拥有关于你的更改的额外信息真的很有用,这样你就可以更好地了解你的方向。 借用一句老生常谈的话,那些不了解自己版本历史的人注定要在他们的项目中重蹈覆辙。

在最简单的提交类型中,你将关于你的更改的消息都包含在同一行中,如下所示

$ hg commit -m "Added my totally sweet painting to the repo."

要从 TortoiseHg 中执行相同的操作,请使用界面最右侧的“提交”按钮。 当你单击该按钮时,会出现一个对话框。 该对话框显示提交(或变更集)中的更改,并为你提供一个文本区域,用于输入你的提交消息。

就是这样。 从这里开始,你继续创作你的绝妙绘画。 随着你的继续创作,定期向你的存储库提交,记录你通过修改文件或添加新文件所做的更改。 你不需要每次保存文件都这样做(我们中的一些人已经将 Ctrl+S 内置到我们的工作风格中,以至于点击它几乎就像肌肉抽搐)。 但是,每当你进行重大更改或在你即将离开工作一段时间时,最好进行提交。 再次,使用视频游戏中的“保存状态”类比作为你何时适合提交的经验法则。

在你工作时,你可以随时询问 Mercurial 它认为自上次提交以来哪些文件已更改。 你只需要发出以下命令

$ hg status

然后,Mercurial 将列出哪些文件已更改、哪些文件已添加以及哪些文件根本未被跟踪。 在 TortoiseHg 中,这些更改显示在左侧的文件列表窗格中(你可能需要单击“刷新”按钮以获取当前视图)。

对我来说,我通常同时打开一个终端窗口和 TortoiseHg。 我从终端输入我所有的 Mercurial 命令,并且我可以从 TortoiseHg 中获得快速(且有吸引力的)提交历史日志。 从技术上讲,我想我可以从 TortoiseHg 的集成控制台窗格(查看显示控制台)完成我所有的命令行工作,但我通常无论如何都会打开一个终端,所以这对我来说没什么大不了的。

了解应该版本化的内容

一旦你弄清楚了版本控制的工作原理,你就会很想在你的项目中的所有内容上使用它。 虽然这样做有一些价值,但这不一定是管理你的项目存储库最有效的方式。 例如,如果你倾向于收集参考文件(视频、照片、情绪板插图等),这些文件往往变化不大,并且实际上不是你的项目本身的组成部分,因此它们实际上不需要进行版本控制。

这是在输入方面。 在输出方面,我倾向于使用与软件开发人员使用版本控制类似的方法。 也就是说,我只版本化我的“源”文件,而不版本化从该源派生的输出文件。 例如,如果我在 Inkscape 中进行设计,我会将我的 SVG 文件包含在存储库中。 但是,如果我需要交付导出的 PNG 或 PDF 或 EPS 文件作为最终作品,我使用 Mercurial 对这些文件进行版本控制。 我总是可以(相对容易地)从源 SVG 重新导出,因此如果这些导出文件丢失,也没那么重要。 因此,我不需要通过跟踪它们来使我的存储库变得混乱。

在像 3D 动画这样更大的项目中,这可能会有点模糊,在这些项目中,重新生成动画帧是一个计算密集型且耗时的过程,如果可以避免,你不想重复这个过程。 但是,对于这些类型的项目,我仍然倾向于将输出保留在我的主存储库之外。 如果版本化这些文件确实至关重要,我可能会选择做一个辅助存储库或一个子存储库来专门保存该输出,但这有点高级了。

当然,关于版本控制的主题,涉及的内容远不止我在这篇文章中介绍的这些,例如将存储库克隆到其他计算机以进行协作或远程工作,创建分支以安全地试验想法和变体,以及将提交标记为重要的里程碑。 但是,这应该足以让你开始走上正确的版本控制之路,并使项目目录永远摆脱那些令人憎恶的 v2v3-FINALv13-FINAL8(等等)文件。

如果你不介意,请在评论中告诉我你对这类文章的看法。 如果有兴趣,我当然可以在未来的“开放艺术”专栏中继续讨论这个问题。

祝你创作出精彩的作品!

User profile image.
Jason van Gumster 主要编造东西。 他写作、制作动画,偶尔也使用开源工具进行教学。 他经营着一家小型独立动画工作室,撰写了《Blender For Dummies》和《GIMP Bible》,并继续在[有时]每周播客《开源创意播客》中滔滔不绝地讲述他的经历。 在 @monsterjavaguns 上进行冒险(和谎言)。

16 条评论

很棒的文章! 多年来,我一直想设置一些东西,但从未真正着手去做。 我现在再试一次。

我使用 Subversion 和 Tortoise 做同样的事情。我使用 SVN 管理 Blender 文件和 Python/C 代码。

不错!Subversion 对于创意项目(特别是协作项目)仍然是一个不错的选择。它是我开始使用的版本控制系统,并且用了好多年。我遇到的情况是,我变得懒惰了,不想仅仅为了 Subversion 而设置服务器。:)

回复 ,作者:antonioya (未验证)

只是想提一下,我在我的个人项目中使用 Subversion,服务器和客户端都在同一台机器上,没有任何问题。至少在 Windows 上使用 Tortoise,这相当轻松。不过,可能会考虑 Hg。

回复 ,作者:Jason van Gumster

感谢指出这一点,Tony。 你绝对正确。我可能没有充分解释我有多么懒惰(一个 "hg init" 命令 vs. 仅仅 2-3 个简单的步骤来设置本地 Subversion 仓库)。

回复 ,作者:Tony (未验证)

这完全公平,也可能是我很快会尝试 Mercurial 的原因。通常不仅仅是节省时间,而是降低门槛/消除障碍。额外的步骤带来的精神负担往往会累积,特别是对于像艺术创作这样的事情,人们可能会经常创建新的仓库。

我坚持使用 SVN 是因为据我所知,它比 GIT 更擅长处理二进制文件 - 包括进行增量差异的能力。 但我也听说过这些增量差异实际上并没有节省多少空间。 我当然愿意四处看看。

当我在考虑这个问题时,也许是时候提醒人们,版本控制本身可能不应该是你的备份解决方案。 :)

回复 ,作者:Jason van Gumster

我记得之前有一篇文章是关于将版本控制用于文档的。我知道在我的工作室里就使用了。

这是我使用搜索引擎找到的。

http://www.makeuseof.com/tag/not-just-for-coders-top-version-control-sy…

我并不惊讶它可以被艺术家用于相互协作。我认为这是一个好主意,因为它使一切井井有条,并提供在出现严重错误时回溯的能力。

版本控制不是唯一可以用于其他用途的技术。例如,我使用 Mantis (www.mantisbt.org) 来跟踪我的家务和项目。它比 Hi and Lois 的家务罐子更好。 :)

在家里,我有一个 cvs 仓库用于个人工作。我使用 cvs 的原因仅仅是因为熟悉它。

哇,CVS?真的吗?我*没有*想到会看到这个。但你是对的。它很熟悉,而且仍然有效。我当然可以看到它在写作中很有用。我喜欢你使用 Mantis... 我也使用 Redmine 做类似的事情。

另外,感谢分享这个链接... 这对专注于写作的人来说,真是一个很好的选择概述。

回复 ,作者:Papo Anaya

我今天的提示
使用秘密分支,并使用 graft 将 cherry-pick 的版本插入到主分支中

哦,我多么喜欢 graft。我只有在想从包含多个文件的提交中 graft 单个文件的更改时才遇到问题。但这很容易解决。

感谢分享!

回复 ,作者:SaltatorMortis (未验证)

我更喜欢 GIT。之前用过 SVN,但 GIT 遥遥领先。

Jason,好文章。我的职业生涯始于 80 年代中期创立和运营一家版本控制公司。我记得当时试图提出这个论点,但人们只是眼神呆滞。(当然,我也记得一位工程经理向我解释说,他们不需要我们的产品,因为“他们是一家只有 15 名程序员的小公司。”时代变了。)

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.