自动化工具生成的哪些文件应该纳入版本控制仓库?

53

我是autotools的新手,正在开发一个C项目,希望将其添加到git存储库中。我需要在版本控制系统中跟踪哪些由autotools生成的文件,哪些应该被忽略?

3个回答

66

不应该在版本控制下保留任何未经手动编辑的文件。这意味着版本控制系统应忽略任何生成的文件。基本上只有以下文件才会被纳入版本控制:

  • configure.ac
  • Makefile.am
  • 文档文件,例如AUTHORSNEWS
  • 子目录中的Makefile.am

为了解决Scharron提出的"准备好安装"版本的问题,有些人在项目的根目录中包含一个脚本,称为bootstrapautogen.sh,当你检出一个新副本时运行一次。你可以在我的一个项目这里看到一个示例。对于一个更简单的项目,你的autogen.sh实际上只需要包含一行:

autoreconf --install || exit 1

虽然一些人喜欢在autogen.sh的结尾自动运行./configure,但更好的方式是手动运行它。

为什么不把所有生成的文件都跟踪到版本控制中呢?因为这些文件的内容取决于你所构建的机器、你生成它们时用的autotools版本以及月亮的相位。任何这些变化发生时,生成的autotools文件都会改变,而你会在提交中得到很多垃圾信息。

此外,任何从版本控制中检出代码以构建它的人都应该安装适当的开发工具,所以你真的不需要担心由于缺少autotools而导致的问题。

VonC所说的关于使用configure文件生成Makefile的C项目对于源代码发行版(当你输入make dist时得到的.tar.gz文件)是正确的,但并不一定适用于从版本控制中新检出的副本。


2
如果您在m4目录中添加了任何自定义宏,当然也必须将其添加。 - ext

12

注意:我同意ptomato回答,并将这个答案留作社区Wiki。
尽管对于源代码分发来说是有意义的,但你的项目可能不是这样的情况。
对于开发目的,ptomato的回答更加合理。


通常所有的C项目都会带有一个configure文件,可以生成用于编译的实际Makefile文件。

因此,在考虑使用autotool链时,我建议对生成的所有文件进行版本控制,直到配置文件为止,因为它们通常只需要一次生成操作即可。

http://upload.wikimedia.org/wikipedia/commons/thumb/8/86/Autoconf.svg/309px-Autoconf.svg.png

这意味着任何拥有你版本项目的检出副本的人都可以立即开始:

./configure
make
make install

所以,尽管通常情况下你不应该对任何生成的文件进行版本控制,但是如果那个项目的其他读者可以从中受益,则可以存储这些文件,特别是:

  • 可以避免重新生成这些文件(达到相同的结果)
  • 可以立即开始配置和编译。

4
我认为你对源代码分发的概念有些混淆了——每个项目都有一个,但这并不同于版本控制中保存的内容。源代码分发应该包括用户构建项目所需的文件;而版本控制则应该包含开发人员构建项目所需的文件。 - ptomato
1
@ptomato:我再次同意。问题是,这些天我一直在重新编译源代码分发项目(但我并不开发它们)。因此,我对VCS中可能存在的内容有所偏见。 - VonC

-2
通常情况下,您不应该将任何生成的文件保存在存储库中(否则您将看到更改并必须提交/还原它们)。 但是,如果您想要将“准备安装”的版本添加(=标记)到您的存储库中,我建议保留configure和Makefile文件。它们是安装所需的文件,应该可以在没有autotools的情况下工作。

11
绝对不能将Makefile放入代码库中。关于是否在repo中包含Makefile.in存在争议(不应该包含,因为“准备好构建”的版本只需存在于tarballs中),但是将Makefile放入repo完全是错误的。configure脚本的整个目的是构建特定于特定机器的Makefile(等等),并且Makefile可能因平台而异。由configure生成的任何内容都不能包含在repo中。 - William Pursell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接