这部分取决于您使用的 VCS。对于我自己的工作,我在 1999 年之前一直使用 SCCS,但为了避免 Y2K 出现问题,我改用了 RCS(SCCS 日期格式使用 2 位数字表示年份,我认为这是不可接受的)。因此,我对如何合理合理地使用这些系统有强烈的看法。在某处,我已经讨论了文件头中的内容,但是找到插图比其他答案更简单......
/*
@(#)File: $RCSfile: stderr.c,v $
@(#)Version: $Revision: 9.14 $
@(#)Last changed: $Date: 2009/07/17 19:00:58 $
@(#)Purpose: Error reporting routines
@(#)Author: J Leffler
@(#)Copyright: (C) JLSS 1988-91,1996-99,2001,2003,2005-09
@(#)Product: :PRODUCT:
*/
这是我最古老的源文件之一 - 从 SCCS 迁移到 RCS。 VCS(即 RCS)自动维护 $RCSfile$、$Revision$ 和 $Date$ 的值。我有一个驱动 Perl 脚本来维护版权日期的 shell 脚本;我需要记住在任何给定年份第一次编辑文件时使用它。我还没有费心制作一个仅仅破解版权行的过滤器脚本(这对我来说有点不寻常 - 我制作了很多脚本)。该文件采用“未分发”格式;当我将它与产品一起分发时,':PRODUCT:' 元关键字被扩展以命名相关产品(通过我的发布构建软件)。显然,我的名字和文件的目的都不需要太多维护。 (顺便说一句,我仍然更喜欢 SCCS 管理关键字的方式 - SCCS 等价于 $RCSfile$ 等)
在版本控制系统本身不支持关键字的情况下,决定如何处理这些信息要困难得多。第一条规则是“不要与你的 VCS 对抗”。战争故事 - 我们尝试与 VCS 作战,但没有成功。很久以前(15 年前),公司从 SCCS 切换到 Atria Clearcase(现在的 IBM Rational ClearCase)。 ClearCase 不支持将版本信息嵌入到源文件中。它确实支持签入触发器。我们编写并部署了一个触发器,以确保将 ClearCase 版本号嵌入到文件中,就像之前的 SCCS 版本号一样。签入触发器工作正常;我们可以在视图内部或外部查看文件,并查看它属于哪个版本。但是版本号的更改破坏了合并代码 - 所有合并都变成了手动合并,即使唯一的冲突是版本号。这是因为我们正在与 VCS 作战,它不愿意让我们获胜。所以,我们最终放弃了签入触发器。
我仍在尝试研究如何使用现代 DVCS(如 git)处理版本标记源文件。看起来我将不得不重新设计我的整个发布系统——可能作为一个涵盖 SCCS 和 RCS 的混合体(就像现在一样,尽管 SCCS 部分已经有十年的大部分时间没有使用过)以及 git。
许多人使用的一个理论是,您应该避免将元数据构建到源文件中。我仍然完全相信这很好 - 我认为即使源文件脱离其原始上下文(已重命名,从其原始包中删除,修改并包含在某些新产品)。在使用 DVCS 时,我可能还不得不接受这种观点。
我的理论(我使用但不一定被其他人使用)是元数据应该在文件中,因为它们并不总是在其原始上下文中使用,并且元数据可以存活并帮助识别其来源,即使是几十年后。因此,当我构建源代码发布时,我使用我的发布软件自动编辑产品信息,使用 :PRODUCT: 等符号来标记应该编辑的内容。如果您下载我贡献给IIUG(国际Informix 用户组)网站的任何包,您可以在工作中看到这一点。我推荐 SQLCMD 作为可能是最大和最新的软件包——尽管它从 90 年代中期和 23 版左右就已经可用了(目前在 86.00 版上)。
我在使用 git 时遇到的最大问题之一是我的几乎所有程序都使用 stderr.c 和 stderr.h 中的代码。但是,我还不清楚如何在使用它的许多产品中合并相同的代码,而无需对其进行多次维护。这远不是我在许多不同产品中使用的唯一一对源文件。但是我不想为每个产品构建整个库 - 库会比许多产品大,并且任何给定的产品只使用库中的一些文件。 ...啊,总有一天,启蒙会到来...
我不同意 cmets 的意见,即文件名不是值得保留在文件中的元数据。我认为值得保留 - 因为名称可以在内容不更改时更改,并且如果元数据存在则更容易查看它的来源。当然,恶意软件可以篡改(或删除)元数据 - 但他们通常不会。