我应该将输出文件放入源代码控制吗?

3

我被要求将我的项目中的每个文件都放入源代码控制中,包括数据库文件(不是模式,而是完整文件)。

这对我来说似乎是错误的,但我无法解释。我找到的关于源代码控制的所有资源都告诉我不要将生成的输出文件放入源代码控制系统中。我明白,这不是“源”文件。

然而,我被提出了以下理由:

  • 谁在乎?我们有足够的带宽。
  • 我不介意每次获取最新版本时都需要解决冲突,这只需要一个点击。
  • 这比考虑好的忽略文件要方便得多。
    • 此外,如果我现在必须在bin文件夹中添加外部DLL文件,则不能忘记将其放入源代码控制中,因为bin文件夹现在没有被忽略。

最后一条的简单解决方案是将文件添加到libraries文件夹中,并从项目中引用它。

请解释一下是否以及为什么将生成的输出文件放入源代码控制中是错误的。

3个回答

3
你没有解释“数据库文件”是什么。
我会将第三方库包含在源代码控制中,因为它们对于构建是必要的,而且在以后使用相同版本的库重现构建时很有用。但是,这些库应该从“libraries”文件夹中包含,而不是从输出目录中包含。
通常情况下,我不会在同一存储库中包含我自己从其他地方编译的库 - 尽管我曾经遇到过这样的情况,其中一些项目没有使用公共库的“最新版本”,而只是偶尔进行更新。
我最重要的实际论点是,如果我们认为磁盘、处理器和网络是免费和瞬间的,那么包含所有内容会使得更难确定每个提交所做的真正更改。查看3个源文件的列表比查看来自obj/bin目录的3个源文件和150个二进制文件要容易。

数据库是ms sql .mdf和.ldf文件。库文件并不是这个问题的主要关注点,我特别关注生成文件的问题。变更集的可读性很好,谢谢! - sebastiaan
1
这里讨论的是文件类型,而不是文件内容。它们是空数据库文件吗?这会让开发人员更轻松上手吗?如果是的话,那很好。但如果它们包含自定义数据,那就是另外一回事了。 - Jon Skeet
准备好震惊了:这是完整的当前工作数据库(我们还没有中央服务器,而且我们正在不同的位置工作)。目前这使得并行工作变得不可能。幸运的是,这很快就会得到解决。我很感激包含一个快速启动数据库的建议,非常棒的想法! - sebastiaan

3
生成的输出文件(通常情况下)在版本控制系统中是“危险”的,因为:
  • 你需要版本化的是如何重新生成它们:当你需要实际更新它们时,你很可能不记得该怎么做了。
  • 它们可能包含一些私有生成的文件,这使得它们在提交者的桌面上可以工作,但在客户端上却不能工作(“在我的机器上可以工作”TM综合症)。
  • 一些生成的文件不容易存储在增量中(特别是二进制文件),使它们占用大量空间(而且清理这些空间的话题总会出现...)。
外部库不是由你的项目直接生成的,可以放在版本控制系统中,尽管像公共Maven仓库这样的外部仓库更适合进行这种管理。

1

我们是否也要将编译后的目标文件,例如从源代码构建的类文件、可执行文件、DLL文件等放入其中?当我们进行大量测试时,如果数据库变得非常庞大,达到了几个千兆字节或者几个太字节,该怎么办呢?

提示就在名字里:这是一个源代码管理系统。

我可以理解把所有东西都放进去的简单性,这样开发人员不会忘记一些重要的文件。但是,如果你正在进行定期的自动化构建,那么这肯定会被检测到吧?

我认为关键短语在这里:

这比考虑好的忽略文件方便多了

你是否明确禁止使用好的忽略文件?我猜你已经排除了.exe和.class(或其他)文件。假设你费心地排除了你的数据库,那会有问题吗?为什么?这是你为了共同利益而选择采取的有意识的行动。在Eclipse中,只需几秒钟即可将新的文件类型添加到工作区的所有项目的CVS忽略规则中。

“无忽略文件”规则几乎是自相矛盾的。一旦你有了自由,可以使用一些忽略文件来智能地排除数据库,为什么不这样做呢?谁会受到影响?只有你自己,如果有的话,而且你也愿意多做一些工作。”

我想我们没有时间来正确地设置源代码控制,所以“就像这个项目是一个巨大的压缩文件一样处理吧”。解决冲突并不需要太多时间。只有在经过x个月的冲突解决后,你花费的时间才会与设置适当的源代码控制相同。 - sebastiaan
@sebastian,是的,我同意这可能是正在发生的事情。我真的不认为设置几个忽略文件会过度努力。 - djna

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