我在Subversion(以及一般的存储库)讨论中经常看到这些词。 在过去的几年里,我一直在我的项目中使用SVN,但是我从来没有掌握这些目录的完整概念。
它们是什么意思?
我在Subversion(以及一般的存储库)讨论中经常看到这些词。 在过去的几年里,我一直在我的项目中使用SVN,但是我从来没有掌握这些目录的完整概念。
它们是什么意思?
当前回答
在SVN中,标记和分支非常相似。
标签=在时间上定义的片段,通常用于发布
分支=在开发过程中定义的片段,通常用于1.0、1.5、2.0等主要版本,然后在发布时标记分支。这允许您继续支持产品版本,同时在主干中进行突破性的更改
Trunk =开发工作空间,这是所有开发应该发生的地方,然后从分支发布合并回来的更改。
其他回答
主干是保存最新源代码和特性的开发线路。它应该包含最新的错误修复以及添加到项目中的最新功能。
分支通常用于做一些远离主干(或其他开发线)的事情,否则会破坏构建。新特性通常构建在分支中,然后合并回主干中。分支通常包含一些代码,这些代码不一定被分支的开发线所批准。例如,程序员可以尝试对分支中的某些内容进行优化,只有在优化令人满意时才会合并回开发线上。
标记是存储库在特定时间的快照。不应该在这些基础上进行任何开发。它们最常用于获取发布给客户端的内容的副本,以便您可以轻松地访问客户正在使用的内容。
这里有一个链接到一个非常好的知识库指南:
源码控制
维基百科上的文章也值得一读。
嗯,我不确定我同意尼克重新标签类似于一个分支。标签只是一个标记
Trunk would be the main body of development, originating from the start of the project until the present. Branch will be a copy of code derived from a certain point in the trunk that is used for applying major changes to the code while preserving the integrity of the code in the trunk. If the major changes work according to plan, they are usually merged back into the trunk. Tag will be a point in time on the trunk or a branch that you wish to preserve. The two main reasons for preservation would be that either this is a major release of the software, whether alpha, beta, RC or RTM, or this is the most stable point of the software before major revisions on the trunk were applied.
在开源项目中,不被项目涉众接受的主要分支可以成为分叉的基础——例如,与其他源代码共享共同起源的完全独立的项目。
分支和标记子树与主干的区别如下:
Subversion allows sysadmins to create hook scripts which are triggered for execution when certain events occur; for instance, committing a change to the repository. It is very common for a typical Subversion repository implementation to treat any path containing "/tag/" to be write-protected after creation; the net result is that tags, once created, are immutable (at least to "ordinary" users). This is done via the hook scripts, which enforce the immutability by preventing further changes if tag is a parent node of the changed object.
Subversion从1.5版开始还增加了与“分支合并跟踪”相关的特性,这样提交到分支的更改就可以合并回支持增量式“智能”合并的主干中。
我认为一些混淆来自标记概念和SVN中的实现之间的差异。对于SVN来说,标签是一个分支,它是一个副本。修改标签被认为是错误的,事实上,像TortoiseSVN这样的工具会警告你,如果你试图用../tags/..在路上。
首先,正如@AndrewFinnell和@KenLiu指出的,在SVN中,目录名称本身没有任何意义——“主干、分支和标记”只是大多数存储库使用的一种常见约定。并不是所有的项目都使用所有的目录(根本不使用“标签”是很常见的),事实上,没有什么可以阻止您调用任何您想要的名称,尽管打破常规经常会令人困惑。
我将描述分支和标记最常见的使用场景,并给出如何使用它们的示例场景。
Trunk: The main development area. This is where your next major release of the code lives, and generally has all the newest features. Branches: Every time you release a major version, it gets a branch created. This allows you to do bug fixes and make a new release without having to release the newest - possibly unfinished or untested - features. Tags: Every time you release a version (final release, release candidates (RC), and betas) you make a tag for it. This gives you a point-in-time copy of the code as it was at that state, allowing you to go back and reproduce any bugs if necessary in a past version, or re-release a past version exactly as it was. Branches and tags in SVN are lightweight - on the server, it does not make a full copy of the files, just a marker saying "these files were copied at this revision" that only takes up a few bytes. With this in mind, you should never be concerned about creating a tag for any released code. As I said earlier, tags are often omitted and instead, a changelog or other document clarifies the revision number when a release is made.
例如,假设你开始一个新项目。你开始在“主干”中工作,最终将以1.0版本发布。
Trunk / -开发版本,即将发布1.0 分支/ -空
一旦1.0.0完成,你将分支trunk到一个新的“1.0”分支,并创建一个“1.0.0”标记。现在,关于最终1.1版本的工作继续在主干中进行。
Trunk / -开发版本,即将发布1.1 分支/1.0 - 1.0.0发布版本 Tags /1.0.0 - 1.0.0发布版本
You come across some bugs in the code, and fix them in trunk, and then merge the fixes over to the 1.0 branch. You can also do the opposite, and fix the bugs in the 1.0 branch and then merge them back to trunk, but commonly projects stick with merging one-way only to lessen the chance of missing something. Sometimes a bug can only be fixed in 1.0 because it is obsolete in 1.1. It doesn't really matter: you only want to make sure that you don't release 1.1 with the same bugs that have been fixed in 1.0.
Trunk / -开发版本,即将发布1.1 分支/1.0——即将发布的1.0.1版本 Tags /1.0.0 - 1.0.0发布版本
一旦发现了足够多的错误(或者可能是一个严重的错误),就决定发布1.0.1版本。因此,您从1.0分支创建了一个标记“1.0.1”,并发布了代码。此时,主干将包含1.1,而“1.0”分支包含1.0.1代码。下次你发布1.0版本的更新时,它将是1.0.2。
Trunk / -开发版本,即将发布1.1 分支/1.0——即将发布的1.0.2版 Tags /1.0.0 - 1.0.0发布版本 Tags /1.0.1 - 1.0.1发布版本
最终,你几乎准备好发布1.1,但你想先做一个测试版。在本例中,您可能会执行“1.1”分支和“1.1beta1”标记。现在,关于1.2(或者2.0)的工作在主干中继续进行,而1.1的工作则在“1.1”分支中继续进行。
Trunk / -开发版本,即将发布1.2 分支/1.0——即将发布的1.0.2版 分支/1.1——即将发布的1.1.0版本 Tags /1.0.0 - 1.0.0发布版本 Tags /1.0.1 - 1.0.1发布版本 Tags /1.1beta a1 - 1.1beta1发布版本
一旦发布了1.1 final版本,就可以从“1.1”分支执行“1.1”标记。
如果您愿意,还可以继续维护1.0,在所有三个分支(1.0、1.1和主干)之间移植错误修复。重要的一点是,对于您所维护的软件的每个主版本,都有一个包含该版本的最新代码版本的分支。
分支的另一个用途是用于特性。这是你分支主干(或你的发布分支之一)并独立开发新特性的地方。一旦特性完成,您将其合并并删除分支。
Trunk / -开发版本,即将发布1.2 分支/1.1——即将发布的1.1.0版本 分支/ui-rewrite -实验特性分支
The idea of this is when you're working on something disruptive (that would hold up or interfere with other people from doing their work), something experimental (that may not even make it in), or possibly just something that takes a long time (and you're afraid if it holding up a 1.2 release when you're ready to branch 1.2 from trunk), you can do it in isolation in branch. Generally you keep it up to date with trunk by merging changes into it all the time, which makes it easier to re-integrate (merge back to trunk) when you're finished.
还要注意,我在这里使用的版本控制方案只是众多方案之一。一些团队会将错误修复/维护版本作为1.1、1.2等,并将主要更改作为1。x, 2。x,等等。这里的用法是相同的,但是您可以将分支命名为“1”或“1”。而不是“1.0”或“1.0. X”。(除此之外,语义版本控制是如何进行版本号的一个很好的指南)。
对于熟悉GIT的人来说,GIT中的master相当于SVN中的trunk。
分支和标记在GIT和SVN中有相同的术语。