什么不应该在源头控制下?

l3d*_*3dx 59 language-agnostic version-control

对于哪些文件和/或目录不应该(在大多数情况下)处于源代码管理之下,最好有一个或多或少的完整列表.您认为应该排除什么?

建议到目前为止:

一般来说

  • 配置包含敏感信息的文件(密码,私钥等)
  • Thumbs.db,.DS_Store和desktop.ini
  • 编辑器备份:*〜(emacs)
  • 生成的文件(例如DoxyGen输出)

C#

  • BIN\*
  • OBJ\*.
  • *.可执行程序

视觉工作室

  • 名为.suo*
  • *.NCB
  • *.用户
  • *.APS
  • *.cachefile
  • *的.backup
  • _UpgradeReport_Files

Java的

  • *.类

日食

我不知道,这就是我现在正在寻找的东西:-)

蟒蛇

  • *.pyc文件

临时文件 - .*.sw? - *〜

Cor*_*y D 42

任何生成的东西.二进制,字节码,从XML生成的代码/文档.

从我的评论者,排除:

  • 构建生成的任何内容,包括代码文档(doxygen,javadoc,pydoc等)

但包括:

  • 您没有OR源的第三方库不构建.

FWIW,在我为一个非常大的项目工作时,我们在ClearCase下有以下内容:

  • 所有原始代码
  • Qt源和内置调试/发布
  • (非常过时)规格

我们没有为我们的软件构建模块.每两周发布一个完整的二进制文件,包含最新的更新.

  • 实际上,将第三方库置于源代码控制之下是非常合理的,特别是如果你没有它们的源代码. (6认同)
  • JavaDoc/Doxygen/etc输出包含在此中. (3认同)
  • 您应该更改此项以说明将由构建生成的任何内容.T4模板的输出可能不会由构建生成,因此应该检入. (3认同)
  • @yves:但是如果你有相同的编译和源版本,它们可能会失去同步.如果有人更新了一些代码并将其检入,但忘记编译它会怎么样?您可能正在使用存储库中过时的编译代码,这可能会导致神秘的错误.如果编译时间是一个很大的问题,那么您可以为编译的目标文件创建一个单独的存储. (2认同)

pgb*_*pgb 18

特定于操作系统的文件,由其文件浏览器生成,如 Thumbs.db.DS_Store


app*_*rat 15

一些其他Visual Studio典型的文件/文件夹

*.cachefile 
*.backup 
_UpgradeReport_Files
Run Code Online (Sandbox Code Playgroud)

例如,我的乌龟全局忽略模式看起来像这样

bin obj *.suo *.user *.cachefile *.backup _UpgradeReport_Files
Run Code Online (Sandbox Code Playgroud)


小智 11

不应检入构建的文件

  • 除非您要将它们部署用于发布.例如,我们的wix项目构建了一个MSI文件,即使我们标记了所有源代码和工具(第三方或其他),它也非常有用,有时候MSI与代码一起存储在我们的存储库中也很关键.当然你可以把它备份到其他地方,但我的问题是为什么? (3认同)

Jon*_*ney 7

科里d已经时产生什么,由生成过程和发展环境产生的是好的候选人具体什么.例如:

  • 二进制文件和安装程序
  • 字节码和档案
  • 从XML和代码生成的文档
  • 由模板和代码生成器生成的代码
  • IDE设置文件
  • 由IDE或编辑器生成的备份文件

上述一些例外情况可能是:

  • 图像和视频
  • 第三方图书馆
  • 特定于团队的IDE设置文件

拿第三方库,如果你需要发货或你的构建依赖于第三方库,将它置于源代码控制之下是不合理的,特别是如果你没有源代码.还要考虑一些源控制系统在存储二进制blob方面效率不高,你可能无法利用这些文件的系统diff工具.

保罗也对生成的文件发表了很好的评论,你应该看看他的答案:

基本上,如果您无法合理地期望开发人员拥有他们所需的确切工具的确切版本,则可以将生成的文件放在版本控制中.

总而言之,您需要根据具体情况考虑您在源代码管理下的所有内容.定义一个简单的列表,列出什么和什么不放在它下面只会对某些人有效,而且可能只有这么长时间.当然,您添加到源代码控制的文件越多,更新工作副本所需的时间就越长.

  • 有时您从源代码构建第三方库,在这种情况下,您可能不会检入二进制文件.但是如果你不是从源代码构建的,那么一定要检查二进制文件. (3认同)

Lir*_*una 6

可以由IDE,构建过程或二进制可执行过程生成的任何内容.


Ed *_*ves 6

我会以不同的方式解决问题; 什么东西应该包含在源代码管理中?您应该只控制那些文件:

  • (需要修订历史记录或在构建之外创建,但它们是构建,安装或媒体的一部分)和
  • 无法通过您控制的构建过程生成AND
  • 对于构建产品的所有用户都是通用的(没有用户配置)

该清单包括以下内容:

  • 源文件
  • 制作,项目和解决方案文件
  • 其他构建工具配置文件(与用户无关)
  • 第三方图书馆
  • 预先构建的文件,包括PDF和文档等媒体
  • 文件
  • 图像,视频,声音
  • 描述文件,如WSDL,XSL

有时,构建输出可以是构建输入.例如,模糊重命名文件可以是输出和输入以保持相同的重命名方案.在这种情况下,使用签入文件作为构建输入,并将输出放在不同的文件中.构建之后,检查输入文件并将输出文件复制到其中并检入.

使用排除列表的问题在于,您永远不会知道所有正确的排除项,并且可能最终源控制不应受源控制的内容.


Pau*_*gar 6

例外情况:

4或5个不同的答案表示生成的文件不应该受源代码控制.那不是真的.

专业工具生成的文件可能属于源代码管理,尤其是在需要这些工具的特定版本的情况下.

例子:

  • bison生成的解析器/ yacc/antlr,
  • autotools文件,如configure或Makefile.in,由autoconf,automake,libtool等创建,
  • 翻译或本地化文件,
  • 文件可能由昂贵的工具生成,只在几台机器上安装它们可能更便宜.

基本上,如果您无法合理地期望开发人员拥有他们所需的确切工具确切版本,则可以将生成的文件放在版本控制中.

svn人员在他们的最佳实践谈话中讨论了这个例外.

  • @Stefano:如果它在源代码控制中不是**,那么它就是随机错误的来源.因为configure和Makefile.in在源代码控制中,我们可以看到它们何时被重新生成,并且*避免*随机错误.在许多情况下,您根本无法授权开发人员使用的工具,就像您希望的那样. (2认同)

Joh*_*and 5

来自编辑的临时文件.

.*.sw?
*~
Run Code Online (Sandbox Code Playgroud)

等等


Joh*_*and 3

包含密码或任何其他敏感信息的配置文件。