是否应该将生成的文档存储在Git存储库中?


49

当您使用jsdocs之类的工具时,它会根据代码中的注释在代码库中生成静态HTML文件及其样式。

应该将这些文件检入Git存储库中,还是应该使用.gitignore忽略它们?


3
当您可以使用页面发布静态HTML时,可能会有一个参数将它们存储在GitHub存储库中。尽管随后出现了一套完全独立的论点,涉及如何确保它们是最新的等等……
蜘蛛鲍里斯

21
如果生成了文件,那么根据定义它们不是source
chrylis-罢工-

3
您发布要发布的内容。特别是在GitHub上。如果希望每个人都看到生成的PDF或图像,则应包括它,而不是期望每个人都安装LaTeX并自行编译。例如,如果存储库不包含生成的图像,仅包含项目文件,那就不是很好。
Džuris,


7
作为第三方图书馆的使用者,我看到图书馆没有在线文档的10次(无论是在存储库的子文件夹中,还是从自述文件中链接),我都会单击并跳过这些图书馆,全部10次。我不会半个小时地与Doxygen闲逛,只是为了看看图书馆是否满足我的需求。
亚历山大

Answers:


131

缺少任何特定需求时,不应检入使用版本控制中签入的其他文件通过构建工具生成,重新创建,构建或生成的任何文件。需要该文件时,可以从另一个文件(重新)构建该文件。源(通常是构建过程的某些方面)。

因此,应使用.gitignore忽略这些文件。


4
但这可能取决于构建工具的版本,甚至取决于构建工具的可用性(例如,要生成某些文件,则需要构建工具的某些旧版本)。您如何处理?您可以在答案中解决吗?
Peter Mortensen

27
@PeterMortensen如果您需要使用特殊版本的buld工具构建的工件,请使用所需版本的构建工具进行构建。这种需求是:a)自己发现的,在这种情况下,您是一个人;b)自述文件中记录(“您需要两个安装了2个特定版本的doxygen ...”);c)由构建脚本处理(他们检查可用的构建工具版本并采取适当措施)。无论如何,源代码控制是针对源代码的,而不是针对构建工件的。
Joker_vD

2
我认为,仅当连续部署服务器以易于访问的方式构建并发布文档时,此答案才可行。否则,在回购中“缓存”文档具有很大的价值,以提高可访问性。任何用户都不必为了查看您的软件文档而为您的构建脚本而烦恼。
亚历山大

4
@Alexander您是否还将内置的二进制文件放入存储库中?该文档已构​​建。您将获取内置的文档,并使其可在某处访问。
1201ProgramAlarm,

5
@ 1201ProgramAlarm“您还将构建的二进制文件也放入存储库吗?” 不,因为与文档相比,构建的二进制文件对在GitHub上浏览的人们的前期价值低。“您可以获取构建的文档,并使其可在某处访问。” 只要是公开托管,可见链接,那就太好了。这可能是最好的情况。
亚历山大

23

我的规则是,当我克隆存储库并按“构建”按钮时,一段时间后,所有内容都将构建。要针对生成的文档实现此目的,您有两种选择:要么由某人负责创建这些文档并将其放入git,要么在我的开发机器上准确记录我需要的软件,然后确保按“ build”按钮可在我的计算机上建立所有文档。

在生成文档的情况下,我对头文件所做的任何单个更改都应更改文档,因此在每个开发人员的计算机上执行此操作更好,因为我一直希望正确的文档,而不仅是在有人更新文档时。在其他情况下,生成某些东西可能很耗时,复杂,需要您仅拥有一个许可证的软件等。在这种情况下,让一个人负责将内容放入git会更好。

@Curt辛普森:把所有的软件需求文档是好了很多,比我在很多地方都看到了。


7
不要记录某个人需要什么软件来构建(或者至少不仅仅记录它):使构建脚本告诉用户他所缺少的东西,或者在合理的情况下甚至自行安装。在我的大多数回购中,任何中途胜任的开发人员都可以运行./Test并获取构建,或者获取有关他需要进行构建的良好信息。
Curt J. Sampson

5
我真的不同意在您指定的情况下将生成的文档放入git可能会很好。这就是我们拥有人工制品和档案的原因。
苏珊

那是你的规则,这是一个好规则,我喜欢它。但是其他人可以制定自己的规则。
Emory

我认为您的意思是“运行构建命令”,因为您的计算机上没有构建按钮。...除非您期望整个构建都与IDE集成在一起,否则这是完全不合理的。
jpmc26

@ jpmc26我发现将整个构建集成到IDE中是完全合理的。我机器上的构建按钮是Command-B。
gnasher729

14

不应检入这些文件,因为已经存在生成它们的数据。您不想两次存储数据(DRY)。

如果您有CI系统,则可以制作该文档并将其存储,然后将其发布/发布到Web服务器。


4

将它们放在某个存储库(最好是自动生成的相同或不同的存储库)中的一个好处是,您可以看到对文档的所有更改。有时,这些差异要比源代码的差异更易于阅读(特别是如果您只关心规范更改,而不是实现之一)。

但是在大多数情况下,不需要将它们置于源代码管理中,如其他答案所述。


1
这几乎需要在用于创建提交的每个存储库中都包含一个预提交钩子。因为如果文档生成过程不是完全自动化的,那么您将获得与文档代码不同步的提交。与未提交的文档相比,那些不完整的提交将更加不利于理解。
cmaster

1
这不必在提交阶段。每次认为它们值得存储时,将其发布很容易成为下游/ CI / Jenkins的工作。这很可能是每次提交,但是在没有充分理由的情况下,应该将决策脱钩。至少我是这样看的。
环己酮

3

忽略了。您将希望使存储库的用户无论如何都能重建它们,并且消除了确保文档始终保持同步的复杂性。如果您希望将所有内容都放在一个地方而不需要构建任何东西,那么没有理由不将构建的工件捆绑在一起。但是,尽管由于那里的复杂性比大多数地方所造成的损害更大,但源存储库并不是真正适合这样做的好地方。


2

这取决于您的部署过程。但是将生成的文件提交到存储库是一个例外,应该尽可能避免。如果你能回答两个与下面的问题,在你的文档检查可能是一个有效的选项:

  • 文档是生产的要求吗?
  • 您的部署系统是否缺少构建文档的必要工具?

如果满足这些条件,则可能是在使用旧系统或具有特殊安全性约束的系统进行部署。或者,您可以将生成的文件提交到release分支中,并使master分支保持干净。


1
将生成的文件提交到release分支并不是在每种情况下都可行,但是有很多方法,尤其是对于使用markdown构建的静态网站之类的东西,这是一个很好的解决方案。我经常这样做,以至于我构建了一个特殊的工具来轻松生成此类提交,并将其作为构建过程的一部分。
Curt J. Sampson

2

这取决于。如果这些文档:

  • 需要像一样成为存储库的一部分readme.md,那么最好将它们保留在git repo中。因为以自动化方式处理这些情况可能很棘手。

  • 如果您没有像CI系统那样自动构建和更新它们的方法,并且打算让普通读者看到它,那么最好将它们保留在git repo中。

  • 需要大量时间来构建它们,然后有理由保留它们。

  • 旨在供一般读者看(如用户手册),并且花费大量时间来构建,而以前的文档变得无法访问(脱机),因此有理由将其保留在git repo中。

  • 旨在向普通读者展示,并且必须显示其更改/演进的历史记录,可以更轻松地提交以前的文档版本,并构建/提交与以前的文档链接的新版本。有道理。

  • 对于所有团队都有特定的公认原因,那么有理由将他们保留在git repo中。(我们不知道您的情况,您和您的团队知道)

在任何其他情况下,都应安全地忽略它。

但是,如果有理由将它们保留在git repo中,则可能表明您的团队面临着另一个更大的问题。(没有配置项系统或类似的,可怕的性能问题,在构建过程中面临停机等)


1

作为版本控制的原则,只有“主要对象”应该存储在存储库中,而不是“派生对象”。

该规则有例外:即,当存储库的使用者需要派生对象,并且可以合理地期望它们没有生成它们所需的工具时。其他考虑因素也在考虑之中,例如材料量是否繁琐?(让所有用户拥有工具对于项目来说会更好吗?)

一个极端的例子是一个项目,该项目实现了一种罕见的编程语言,其编译器是用该语言本身编写的(众所周知的示例包括OcamlHaskell)。如果只有编译器源代码在存储库中,则没有人可以构建它;否则,任何人都无法构建它。它们没有可在虚拟机上运行的编译器的编译版本,因此它们可以编译该编译器的源代码。而且,该语言的最新功能会立即在编译器源代码中使用,因此始终需要接近最新版本的编译器来构建它:单独获得一个月的编译器可执行文件不会编译当前代码,因为该代码使用了一个月前不存在的语言功能。在这种情况下,几乎可以肯定必须将编译器的编译版本检入到存储库中并保持最新状态。

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.