我在Subversion(以及一般的存储库)讨论中经常看到这些词。 在过去的几年里,我一直在我的项目中使用SVN,但是我从来没有掌握这些目录的完整概念。
它们是什么意思?
我在Subversion(以及一般的存储库)讨论中经常看到这些词。 在过去的几年里,我一直在我的项目中使用SVN,但是我从来没有掌握这些目录的完整概念。
它们是什么意思?
当前回答
首先,正如@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”。(除此之外,语义版本控制是如何进行版本号的一个很好的指南)。
其他回答
中继目录可能是您最熟悉的目录,因为它用于保存最新的更改。你的主要代码库应该在trunk中。
分支目录用于保存分支,无论它们是什么。
标签目录主要用于标记一组特定的文件。您可以对发布版本这样做,其中您希望“1.0”是这些修订版本的这些文件,“1.1”是这些修订版本的这些文件。通常,标签制作完成后就不需要修改了。有关标签的更多信息,请参见第4章。分支和合并(在Subversion版本控制中)。
嗯,我不确定我同意尼克重新标签类似于一个分支。标签只是一个标记
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版开始还增加了与“分支合并跟踪”相关的特性,这样提交到分支的更改就可以合并回支持增量式“智能”合并的主干中。
One of the reasons why everyone has a slightly different definition is because Subversion implements zero support for branches and tags. Subversion basically says: We looked at full-featured branches and tags in other systems and did not found them useful, so we did not implement anything. Just make a copy into a new directory with a name convention instead. Then of course everyone is free to have slightly different conventions. To understand the difference between a real tag and a mere copy + naming convention see the Wikipedia entry Subversion tags & branches.
对于熟悉GIT的人来说,GIT中的master相当于SVN中的trunk。
分支和标记在GIT和SVN中有相同的术语。
标签=在时间上定义的片段,通常用于发布
我认为这就是人们通常所说的“标签”。但是在Subversion中:
它们没有任何正式的含义。文件夹对于SVN来说就是一个文件夹。
我觉得很困惑:一个对分支或标签一无所知的修订控制系统。从实现的角度来看,我认为创建“副本”的Subversion方式非常聪明,但我必须了解它,这就是我所说的有漏洞的抽象。
或者我使用CVS的时间太长了。