我在Subversion(我猜通用存储库)讨论中已经看到了很多这样的话。 过去几年我一直在为我的项目使用SVN,但我从未掌握过这些目录的完整概念。
他们是什么意思?
答案 0 :(得分:892)
嗯,不确定我是否同意Nick重新标记类似于分支。标签只是一个标记
Trunk将成为发展的主体,源于项目的开始直至现在。
Branch将是从主干中某个点派生的代码副本,用于对代码进行重大更改,同时保留主干中代码的完整性。如果主要变更按计划运作,它们通常会合并回主干。
Tag将是您希望保留的主干或分支上的某个时间点。保存的两个主要原因是这是软件的主要版本,无论是alpha版,beta版,RC版还是RTM版,或者在应用主干版本修改之前,这是软件中最稳定的一点。
在开源项目中,项目利益相关者不接受主干的主要分支可以成为 forks 的基础 - 例如,与其他源代码共享共同起源的完全独立的项目
分支和标记子树在以下方面与主干区分开来:
Subversion允许系统管理员创建钩子脚本,这些脚本在某些事件发生时被触发执行;例如,将更改提交到存储库。对于典型的Subversion存储库实现来说,在创建之后将包含“/ tag /”的任何路径视为写保护是很常见的;最终结果是标签一旦创建,就是不可变的(至少是“普通”用户)。这是通过钩子脚本完成的,如果 tag 是更改对象的父节点,则会通过阻止进一步更改来强制实现不变性。
从版本1.5开始,Subversion还添加了与“分支合并跟踪”相关的功能,以便可以将提交到分支的更改合并回主干,并支持增量,“智能”合并答案 1 :(得分:550)
答案 2 :(得分:94)
除了Nick所说的,你可以在Streamed Lines: Branching Patterns for Parallel Software Development
找到更多信息
在此图中,main
是主干,rel1-maint
是分支,1.0
是标记。
答案 3 :(得分:75)
通常(工具不可知视图),分支是用于并行开发的机制。 SCM可以具有0到n个分支。 Subversion有0。
中继是主分支recommended by Subversion,但您绝不会被迫创建它。您可以将其称为“主要”或“发布”,或者根本不称之为!
分支代表开发工作。它永远不应该在资源(如'vonc_branch')之后命名,而是在:
之后命名标记是文件的快照,以便轻松返回该状态。 The problem is that tag and branch is the same in Subversion。我肯定会推荐偏执的方法:
您可以使用Subversion提供的其中一个访问控制脚本,以防止任何人在标记区域中创建新副本。
标签是最终的。它的内容永远不会改变。决不。永远。你在发行说明中忘了一行?创建一个新标签。废弃或删除旧的。
现在,我读了很多关于“在这样的分支中合并这样的东西,然后最终在主干分支中”。 这称为合并工作流程,此处没有强制要求。这不是因为你有一个主干分支,你必须合并任何东西。
按照惯例,trunk分支可以表示开发的当前状态,但这是一个简单的顺序项目,即具有以下项目:
因为有了这些场景中的一个(或全部),你会得到四个“中继”,四个“当前的发展”,并不是你在那些并行开发中所做的一切都必须在'trunk'中合并。 / p>
答案 4 :(得分:37)
在SVN中,标签和分支非常相似。
标记 =定义的时间片,通常用于发布
分支 =也是一个定义的时间片,开发可以继续,通常用于主要版本,如1.0,1.5,2.0等,然后当你发布时标记分支。这使您可以继续支持生产版本,同时继续进行中断中的更改
Trunk =开发工作空间,这是所有开发应该发生的地方,然后更改从分支版本合并回来。
答案 5 :(得分:29)
它们实际上没有任何正式含义。文件夹是文件夹 到SVN。它们是组织项目的普遍接受的方式。
行李箱是您保持主要发展方向的地方。您可以在分支文件夹中创建分支,这些分支很难在短文中解释。
分支是您与项目分开处理的项目子集的副本。也许是因为实验可能不会出现在任何地方,或者可能是下一个版本,当它变得稳定时,你将稍后合并回主干。
标签文件夹用于创建存储库的标记副本,通常是在发布检查点。
但就像我说的那样,对于SVN,文件夹是一个文件夹。 branch
,trunk
和代码只是一种惯例。
我正在大量使用“复制”这个词。 SVN实际上并没有在存储库中制作完整的副本。
答案 6 :(得分:13)
trunk 是包含最新源代码和功能的开发行。它应该包含最新的错误修复以及添加到项目中的最新功能。
分支通常用于远离主干(或其他开发线),否则破坏构建。新功能通常构建在分支中,然后合并回主干。分支通常包含不一定被批准用于其分支的开发线的代码。例如,程序员可以尝试对分支中的某些内容进行优化,并且只有在优化满意后才会在开发行中合并。
标记是特定时间存储库的快照。这些都不应该发展。它们通常用于获取发布到客户端的副本,以便您可以轻松访问客户端正在使用的内容。
这是一个非常好的存储库指南的链接:
维基百科的文章也值得一读。
答案 7 :(得分:11)
现在关于软件开发的事情,对于任何事情都没有一致的知识,每个人似乎都有自己的方式,但这是因为它无论如何都是一个相对年轻的学科。
这是我简单明了的方法,
trunk - trunk目录包含最新,已批准和已合并的工作主体。与许多人承认的相反,我的行李箱仅用于清洁,整洁,批准的工作,而不是开发区域,而是一个释放区域。
在某个特定的时间点,当主干似乎已准备好释放时,它会被标记并释放。
分支机构 - 分支目录包含实验和正在进行的工作。分支机构的工作停留在那里,直到被批准合并到主干。对我来说,这是完成所有工作的领域。
例如:我可以在产品的第五轮开发中使用 iteration-5 分支,也可以使用 prototype-9 分支进行第九轮实验等等。
标记 - 标记目录包含已批准的分支和主干版本的快照。每当分支机构被批准合并到主干中,或者发布主干时,都会在标签下创建已批准的分支或主干版本的快照。
我认为有了标签我可以很容易地来回跳跃,很容易就能引起兴趣。
答案 8 :(得分:10)
当我查找author 2计算机视觉应用程序编程手册OpenCV的网站时,我找到了关于SVN的精彩教程,我认为我应该分享。
他有一个关于如何使用SVN以及短语“trunk”,“tag”和“branch”的含义的教程。
直接从他的教程中引用:
您的团队当前正在使用的软件项目的当前版本通常位于名为 trunk 的目录下。随着项目的发展,开发人员更新版本修复错误,添加新功能)并在该目录下提交更改。
在任何给定的时间点,您可能希望冻结版本并捕获软件的快照,就像在开发的这个阶段一样。这通常对应于您的软件的官方版本,例如,您将提供给客户的版本。这些快照位于项目的标记目录下。
最后,在某些时候为您的软件创建新的开发线通常很有用。例如,当您希望测试替代实施时,您必须修改软件,但在决定是否采用新解决方案之前,您不希望将这些更改提交到主项目。然后,主要团队可以继续处理项目,而其他开发人员则可以使用原型。您可以将项目的这些新开发项目放在名为 branches 的目录中。
答案 9 :(得分:9)
trunk目录是您可能最熟悉的目录,因为它用于保存最新的更改。您的主代码库应该在trunk中。
分支目录用于保存您的分支,无论它们是什么。
tags目录主要用于标记某组文件。你可以在发布版本中执行此操作,在这些修订版中你希望“1.0”是这些文件,在这些版本中你想要“1.1”这些文件。您通常不会在制作标签后对其进行修改。有关代码的详情,请参阅 Chapter 4. Branching and Merging (在 Version Control with Subversion 中)。
答案 10 :(得分:9)
每个人的定义略有不同的原因之一是Subversion对分支和标签实施零支持。 Subversion基本上说:我们在其他系统中查看了功能齐全的分支和标签,并没有发现它们有用,所以我们没有实现任何东西。只需将副本复制到名为约定的的新目录中。当然,每个人都可以自由地拥有略微不同的约定。要理解真实标记与纯粹的复制+命名约定之间的区别 请参阅维基百科条目 Subversion tags & branches 。
答案 11 :(得分:8)
Tag =定义的时间片,通常用于发布
我认为这就是“标签”的含义。但是在Subversion:
它们实际上没有任何正式含义。文件夹是SVN的文件夹。
我觉得相当混乱:一个对分支或标签一无所知的修订控制系统。从实现的角度来看,我认为Subversion创建“副本”的方式非常聪明,但我必须知道它是我所谓的 leaky abstraction 。
或许我刚刚使用CVS太久了。
答案 12 :(得分:6)
我认为一些混淆来自于标签概念与SVN中的实现之间的区别。对于SVN,标签是一个分支,它是一个副本。修改标签被认为是错误的,事实上,如果你试图用路径中的../tags/ ..修改任何东西,TortoiseSVN之类的工具会发出警告。
答案 13 :(得分:5)
我不确定'标签'是什么,但分支是一个相当常见的源控制概念。
基本上,分支是一种在不影响主干的情况下处理代码更改的方法。假设您要添加一个相当复杂的新功能。您希望能够在进行更改时签入更改,但在完成该功能之前,不要让它影响主干。
首先你要创建一个分支。这基本上是您创建分支时的主干副本。然后,您将在分支机构中完成所有工作。在分支中进行的任何更改都不会影响主干,因此主干仍然可用,允许其他人继续在那里工作(如做错误修正或小增强)。完成功能后,您将分支重新集成到主干中。这会将所有更改从分支移动到主干。
人们使用分支机构的模式有很多种。如果您的产品一次支持多个主要版本,通常每个版本都是一个分支。在我工作的地方,我们有一个QA分支和一个生产分支。在将代码发布到QA之前,我们将更改集成到QA分支,然后从那里进行部署。在发布到生产时,我们从QA分支集成到生产分支,因此我们知道生产中运行的代码与QA测试的代码相同。
这是Wikipedia entry on branches,因为他们可能比我能更好地解释事情。 :)
答案 14 :(得分:3)
对于熟悉GIT的人来说,GIT中的master等同于SVN中的trunk。
分支和标记在GIT和SVN中都有相同的术语。
答案 15 :(得分:2)
Trunk :在敏捷的每个冲刺完成后,我们推出了可部分发货的产品。这些版本保存在行李箱中。
分支机构:每个正在进行的冲刺的所有并行开发代码都保存在分支机构中。
标签:每当我们发布部分可交付的产品类型的测试版时,我们都会为其制作标签。这为我们提供了那个时间点可用的代码,允许我们在开发过程中的某个时刻返回该状态。