对于哪些文件和/或目录不应该(在大多数情况下)处于源代码管理之下,最好有一个或多或少的完整列表。您认为应该排除什么?
建议到目前为止:
一般来说
-
配置包含敏感信息的文件(密码,私钥等)
-
Thumbs.db,.DS_Store和desktop.ini
-
编辑器备份:*?(emacs)
-
生成的文件(例如DoxyGen输出)
C#
视觉工作室
-
名为.suo *
-
* .NCB
-
*。用户
-
* .APS
-
* .cachefile
-
*的.backup
-
_UpgradeReport_Files
Java的
日食
我不知道,这就是我现在正在寻找的东西:-)
Python
临时文件
- 。*。sw?
- *?
-
社区维基?
-
可能重复? stackoverflow.com/questions/85353/…
-
您可以在源代码管理中保留任何内容,具体取决于您的问题域。这不是一个真正的问题。
-
是的,你可以,但大多数人都有他们想忽略的东西。我认为列出最常见的列表是个好主意。
-
我同意,也许应该是社区维基
-
如何要求澄清,而不是关闭问题?
-
哇,收盘有点苛刻。完全合情合理的问题。
-
这听起来像是一个真正的问题。投票重新开放
-
另一个'不'问题xD
-
@Arnis L:这怎么不是问题?
-
我不打算吃所有的downvotes来说它,但我认为从未检查生成的DLL和EXE的传统智慧通常基于货物崇拜"最佳实践"而没有任何真正的支持。它通常很有用而且很少有害。
-
@Jon:我现在很好奇 - 它有什么用?为什么你不能只检查修订版并简单地重新编译以生成所有这些dll和exe的?
-
@skybluecodefier我个人曾多次看到构建在生产紧急情况发生时并没有真正起作用。构建应始终有效,但有时则不然,并且没有二进制文件会有实际成本。实际提供它们的成本是多少?
-
@ l3dx你见过github.com/github/gitignore吗?我在底部的答案中再提一点。
-
@Jon成本是他们倾向于与他们生成的源不同步,所以你不一定能确定哪个源对应于你正在部署的代码。我通常建议确保您的构建过程是密闭且可重复的,然后从repo中删除生成的文件。
任何生成的东西。二进制,字节码,从XML生成的代码/文档。
从我的评论者,排除:
-
构建生成的任何内容,包括代码文档(doxygen,javadoc,pydoc等)
但包括:
FWIW,在我为一个非常大的项目工作时,我们在ClearCase下有以下内容:
-
所有原始代码
-
Qt源和内置调试/发布
-
(非常过时)规格
我们没有为我们的软件构建模块。每两周发布一个完整的二进制文件,包含最新的更新。
-
JavaDoc / Doxygen / etc输出包含在此中。
-
但它可能非常有用。考虑一个大型存储库,在多个应用程序中共享许多文件。如果我决定使用其中一个应用程序,我需要在编译修复程序之前重新编译一次。除非有人向我提供目标文件包,否则可能需要很长时间。存储库可以提供所有这些。
-
@yves:但是如果你有相同的编译和源版本,它们可能会失去同步。如果有人更新了一些代码并将其检入,但忘记编译它会怎么样?您可能正在使用存储库中过时的编译代码,这可能会导致神秘的错误。如果编译时间是一个很大的问题,那么您可以为编译的目标文件创建一个单独的存储。
-
@David:是的。但是你知道,人们必须对他们的所作所为负责。对于isntance,在普通的存储库(没有目标文件)上,他们不能忘记提交他们修改的每个源文件,否则它可能会破坏构建
-
源控制是保存和跟踪"源"的修订。将编译后的文件放在源代码控制上可能会加速某种情况,但会导致多用户环境混乱并导致更多的故障排除问题。
-
您应该更改此项以说明将由构建生成的任何内容。 T4模板的输出可能不会由构建生成,因此应该检入。
-
专业工具生成的文件是一个例外:stackoverflow.com/questions/1273921/…。
-
这个答案非常明显,当然这是临时/自动生成的东西。哪些文件通常属于此类别?
-
实际上,将第三方库置于源代码控制之下是非常合理的,特别是如果你没有它们的源代码。
-
你需要进一步限定你的答案!我同意Matt,二进制第三方依赖关系对于源代码控制来说绝对重要。
-
有时需要放置二进制文件和其他可以在版本控制下生成的东西。 / Folks已经提到了第三方库。 / Another:生成的东西依赖于非版本控制的工具,如库,链接器。 /我有时版本控制这样生成的东西,并建立测试,检查我们可以重新生成。 /有时生成的东西是文本,有时是二进制。
-
顺便说一句,不同的术语"源代码控制"和"版本控制"提供了见解。最初,像SCCS和RCS这样的版本控制工具只能很好地处理文本,因此强调源代码(文本)控制。但是不是文本的东西需要跟踪它的历史。 /如果你的工具无法对任意东西进行版本控制,那么你需要更好的工具!!!!
操作系统特定文件,由其文件浏览器生成
Thumbs.db和.DS_Store
一些其他Visual Studio典型的文件/文件夹
1 2 3
| *.cachefile
*.backup
_UpgradeReport_Files |
例如,我的乌龟全局忽略模式看起来像这样
1
| bin obj *.suo *.user *.cachefile *.backup _UpgradeReport_Files |
-
这是一个比"生成的东西"更有用的答案。 Upvoted。
不应检入构建的文件
-
除非您要将它们部署用于发布。例如,我们的wix项目构建了一个MSI文件,即使我们标记了所有源代码和工具(第三方或其他),它也非常有用,有时候MSI与代码一起存储在我们的存储库中也很关键。当然你可以把它备份到其他地方,但我的问题是为什么?
-
同意,我们的CRUD部分课程已签入以符合SOX法律。
-
答案太通用了。 OP专门询问哪些文件。
就像Corey D所说的那样,生成的任何内容,特别是构建过程和开发环境生成的任何东西都是很好的候选者。例如:
-
二进制文件和安装程序
-
字节码和档案
-
从XML和代码生成的文档
-
由模板和代码生成器生成的代码
-
IDE设置文件
-
由IDE或编辑器生成的备份文件
上述一些例外情况可能是:
-
图像和视频
-
第三方图书馆
-
特定于团队的IDE设置文件
拿第三方库,如果你需要发货或你的构建依赖于第三方库,将它置于源代码控制之下是不合理的,特别是如果你没有源代码。还要考虑一些源控制系统在存储二进制blob方面效率不高,你可能无法利用这些文件的系统diff工具。
保罗也对生成的文件发表了很好的评论,你应该看看他的答案:
Basically, if you can't reasonably
expect a developer to have the exact
version of the exact tool they need,
there is a case for putting the
generated files in version control.
总而言之,您需要根据具体情况考虑您在源代码管理下的所有内容。定义一个简单的列表,列出什么和什么不放在它下面只会对某些人有效,而且可能只有这么长时间。当然,您添加到源代码控制的文件越多,更新工作副本所需的时间就越长。
-
有时您从源代码构建第三方库,在这种情况下,您可能不会检入二进制文件。但是如果你不是从源代码构建的,那么一定要检查二进制文件。
-
+1无论如何,如果你可以从源代码构建第三方库,那就去吧。
-
对我来说似乎很简单。如果您生成图像和库以及版本控制下的内容,请不要检查它们。如果不这样做,那么至少考虑检查它们。
-
在两种情况下,除非由构建生成:"从XML和代码生成的文档"和"由模板和代码生成器生成的代码",否则应该检入它们。
-
@John:即使在这些情况下,也有例外。请参阅stackoverflow.com/questions/1273921/…。
可以由IDE,构建过程或二进制可执行过程生成的任何内容。
-
那些可以生成但不生成的东西呢?运行单个文件生成器"自定义工具"之一的输出仅在请求时或源文档更改时生成。它不会由构建生成。
-
'或二进制可执行过程' - 包括Doxygen输出等。
-
@John:如果每次签入都会生成自定义工具,我不确定是否可以节省请求。如果不是,则存在陈旧工具的危险。我不想让他们签到。
例外:
4或5个不同的答案表示生成的文件不应该受源代码控制。那不是真的。
专业工具生成的文件可能属于源代码管理,尤其是在需要这些工具的特定版本的情况下。
例子:
-
bison生成的解析器/ yacc / antlr,
-
autotools文件,如configure或Makefile.in,由autoconf,automake,libtool等创建,
-
翻译或本地化文件,
-
文件可能由昂贵的工具生成,只在几台机器上安装它们可能更便宜。
基本上,如果您无法合理地期望开发人员拥有他们所需的确切工具的确切版本,则可以将生成的文件放在版本控制中。
svn人员在他们的最佳实践谈话中讨论了这个例外。
-
你不能,但你绝对应该。在团队中使用不同版本的开发工具是迈向疯狂的第一步。
-
@Stefano:嗯,考虑一个开源项目,开发人员安装的特定版本的野牛会根据分布情况而有所不同。实际上,我们的autotools文件有时会随机重新生成。
-
@Paul:这是一个难以发现,难以重现的错误的潜在来源。当然,我有点极端主义(轻微的差异往往是无关紧要的),但你应该努力建立一个统一的,定义良好的开发环境和运行时。
-
@Stefano:如果它不在源代码控制中,它是随机错误的来源。因为configure和Makefile.in在源代码控制中,我们可以看到它们何时被重新生成,并避免随机错误。在许多情况下,您根本无法授权开发人员使用的工具,就像您希望的那样。
-
少数机器上的工具示例通常是FPGA工具(用于芯片设计)不在软件团队的机器上。
-
在Windows上,您可以使用Chocolatey packages.config文件(chocolatey.github.io/usage.html#the-packagesconfig-file)为开发人员强制执行确切的工具版本。我对linux上的工具/包管理知之甚少,但不会像这样工作:stackoverflow.com/a/10123093/1698736?
我会以不同的方式解决问题;什么东西应该包含在源代码管理中?您应该只控制那些文件:
-
(需要修订历史记录或在构建之外创建,但它们是构建,安装或媒体的一部分)和
-
无法通过您控制的构建过程生成AND
-
对于构建产品的所有用户都是通用的(没有用户配置)
该清单包括以下内容:
-
源文件
-
制作,项目和解决方案文件
-
其他构建工具配置文件(与用户无关)
-
第三方图书馆
-
预先构建的文件,如PDF和&amp ;;文件
-
文件
-
图像,视频,声音
-
描述文件,如WSDL,XSL
有时,构建输出可以是构建输入。例如,模糊重命名文件可以是输出和输入以保持相同的重命名方案。在这种情况下,使用签入文件作为构建输入,并将输出放在不同的文件中。构建之后,检查输入文件并将输出文件复制到其中并检入。
使用排除列表的问题在于,您永远不会知道所有正确的排除项,并且可能最终源控制不应受源控制的内容。
来自编辑的临时文件。
等等
-
这应该在全局忽略列表中,不一定是每个存储库忽略列表。
-
并不是说它也不能存在于每个存储库忽略列表中。
-
当然,我完全同意(事实上,他们在我的全球.gitignore文件中)。这个问题似乎并不特定于每个存储库的忽略列表,或者我错过了什么?
desktop.ini是我见过的另一个Windows文件。
实际配置文件如asp.net中的web.config,因为人们可以有不同的设置。通常我处理这个问题的方法是在SVN上安装web.config.template。人们得到它,进行他们想要的更改并将其重命名为web.config。
除了这个以及你所说的,还要注意包含密码的敏感文件(例如)。
避免使用Windows(拇指)或Mac OS(.ds_store)生成的所有烦人文件
配置包含密码或任何其他敏感信息的文件。
*.bak由WinMerge制作。
另外:
视觉工作室
我发现考虑它的最好方法如下:
假装你有一台全新的,商店买的电脑。您安装操作系统和更新;您安装所有开发工具,包括源控制客户端;您创建一个空目录作为本地源的根目录;你做一个"获取最新"或源控制系统调用它来获取你想要构建的发行版的干净副本;然后运行构建(从源代码控制中获取),然后构建所有内容。
这个思维过程告诉你为什么某些文件必须在源代码控制中:所有这些都是构建在一个干净的系统上工作所必需的。这包括.designer.cs文件,T4模板的输出以及构建不会创建的任何其他工件。
临时文件,配置除全局开发和敏感信息之外的任何内容
-
配置特定于您的环境的文件,即。使用ANT时,构建脚本受源代码控制,但脚本加载的属性文件不是
没有进入源代码控制的东西分为3类
与项目完全无关的事情(显然)
可以在安装介质上找到的东西,永远不会改变(例如:第三方API)。
可以通过构建过程从源代码控制(或类2中的事物)中的东西机械生成的东西。
-
我们检查第三方JAR,以便当我们回到存储库中的先前版本时,我们拥有随该版本软件一起分发的JAR。
-
是的,我不得不不同意#2。
-
在所有情况下,我不同意第3点,请参阅stackoverflow.com/questions/1273921/…。
-
@Thomas:如果你能保留这些JAR的安装程序,你应该保留它。如果你不能,那么它不会违反#2。
我总是使用www.gitignore.io生成一个正确的.ignore文件。
如果您的代码有运行时环境(例如依赖库,特定的编译器版本等),请不要将包放入源代码控制中。我的做法很残酷,但很有效。我提交了一个makefile,它的作用是下载(通过wget)这些东西,解压缩它,并构建我的运行时环境。
无论用什么语言:
-
缓存文件
-
通常,导入的文件也不应该(如用户上传的图像,在Web应用程序上)
-
临时文件;甚至是你的操作系统生成的(如windows下的thumbs.db)或IDE
-
用密码配置文件?取决于谁有权访问存储库
对于那些不了解它的人:svn:ignore太棒了!
-
我正在编辑我的git-ignore列表,这就是我提出这个问题的原因。 :-)
-
应该猜到了:-D
-
请注意,如果您正在编辑.gitignore,您可能希望将问题扩展为"项目中的内容.gitignore以及属于我的全局.gitignore的内容?"例如,您可能希望全局忽略*?,因为编辑器生成的备份与您的项目无关。
-
我不仅对.gitignore感兴趣:)我也使用其他SCM系统,刚刚开始搜索要排除的commnon文件列表
我有一个特殊的.c文件,不进入源代码管理。
规则在构建过程中生成的源代码控制中没有任何内容。
唯一已知的例外是工具是否需要构建自身的旧版本(引导程序问题)。在这种情况下,您需要在源代码管理中使用已知的良好引导副本,以便可以从空白构建。
在这里走出困境,但我相信如果您在Visual Studio中使用任务列表,它们将保存在.suo文件中。这可能不是让它们保持在源代码管理中的理由,但这是在某处保留备份的原因,以防万一......
自从提出这个问题以来已经过了很多时间,而且我认为很多答案虽然相关,却没有关于每种语言或IDE级别的.gitignore的详细信息。
Github推出了一个非常有用的,社区合作的.gitignore文件列表,用于各种项目和IDE,值得一看。
这是git repo的链接:https://github.com/github/gitignore
要回答这个问题,以下是相关的例子:
-
C# - >请参阅Visual Studio
-
视觉工作室
-
Java的
-
日食
-
Python
还有特定于操作系统的.gitignore文件。以下:
因此,假设您正在运行Windows并使用Eclipse,您只需将Eclipse.gitignore和Windows.gitignore连接到项目顶级目录中的.gitignore文件即可。很漂亮的东西。
不要忘记将.gitignore添加到您的仓库并提交它!
有可能,您的IDE已经为您处理了这个问题。无论如何,Visual Studio都可以。
对于.gitignore文件,如果您看到特定.gitignore中缺少任何文件或模式,则可以使用建议的更改在该文件上打开PR。查看提交和拉取请求跟踪器的想法。
-
项目的.gitignore文件应仅包含项目特定的排除项。由于您的本地环境(例如*~ [特定于编辑器]或Thumbs.db [OS])的排除应该在.git/info/excludes(请参阅help.github.com/articles/ignoring-files)或更好的gitignore.global config属性指向的主目录中的文件。
意见:如果需要,一切都可以在源代码控制中,除非它带来重大的存储库开销,例如频繁更改或大块。
第三方二进制文件,难以生成(就时间而言)生成的文件以加快部署过程,一切正常。
源控制的主要目的是将一个相干系统状态与修订号相匹配。如果可能的话,我会用代码构建工具和目标操作系统来冻结整个宇宙。
-
我也希望整个宇宙都受版本控制。
-
-1我很抱歉兄弟,但我讨厌配置文件(也就是说,对于你自己的开发环境......不适用于你的应用程序)以及每次在源代码管理中编译时生成的内部dll和其他文件。通过不断更新,快速查看"真实"变化会变得更加繁琐。我没有给出-1很多,但我目前正在与这样做的人一起工作,它不断引起与二进制文件的冲突,而经验不足的程序员来找我修复它们。
-
Downvoting。如果你有一个不错的构建系统和依赖管理器,通常没有理由将生成的文件和第三方二进制文件放在你的VCS仓库中。