向 SVN 中的分支提交错误修复时如何管理修订号?

How are revision numbers managed when committing bug-fixes to a branch in SVN?

我的项目使用红皮书推荐的SVN布局,例如我确实创建了 ^project/trunk^project/branches^project/tags 子目录。

对于项目的第一个版本 1.0.0,我将 trunk 修订版 240 复制到 branches,并将其命名为 ^project/branches/release-1.0.0。与此同时,trunk 的工作继续进行到最新的修订版 271 和选定修订版的一些错误修复(假设一些来自 r252,一些来自 r268,但并不是所有在这两个修订版中对 trunk 提交的更改)应该向后移植到 1.0.0 版分支,从而生成 1.0.1 版。因此,我将 release 1.0.0 签出到一个新的工作目录中,并在那里手动应用了错误修复。

现在我的问题是:如果我从 ^project/branches/release-1.0.0 的这个工作目录提交更改,如果我理解正确的话,我将得到修订版 272,但是下一个 trunk 修订版当新的时候呢? trunk 工作目录中的更改将被提交? trunk 会被分配到修订版 273 吗?

trunk r271:r272 或 r272:r273 之间有什么区别?当查看 trunk 历史时 svn log -r271:272,以及 branches/release-1.0.0 上的相应 svn log -r240-271,它们是否不存在,就像 branches 修订 r240:271 一样?

使用过 SCCS、RCS 和 CVS 后,我发现在 SVN(例如版本 1.0 修订版 1)中没有 version/revision 唯一标识分支的方案有点令人困惑。也许我不明白这些修订号在 SVN 中是什么,那么包本身 version/revision 的最佳编号方案是什么 以及这些数字如何相关到 SVN 的修订号?

当然,我希望有连续的修订号(在次要版本号的意义上),例如 1.0.1、1.0.2、1.1.0、1.2.0、1.2.1 等包本身,但在SVN的符号中,1.0.0然后是r240,1.0.1会变成r272,但是1.1.0是r268,而如果我正确理解红皮书,1.1.1会变成r274。还是我弄错了 SVN 中的术语 "revision"?

if I commit the changes from this working directory of the ^project/branches/release-1.0.0 I will get revision 272 if I understand it correctly

是的,没错。

Will trunk be assigned revision 273 then?

是的(虽然这在技术上不是 100% 正确,请参阅我下面的解释)。

And what would be the differences between trunk r271:r272 or r272:r273?

由于 r272 是对分支的提交(而不是 trunk),因此 r271 和 r272 之间的 trunk 没有区别。但是,由于 r273 再次提交到 trunk,因此 r272:r273 的差异将是 non-empty.

svn 中的修订号是存储库在某个时间点的状态的标识符。对于每个提交的更改,无论在存储库中的哪个位置,修订号都会递增 1,以便可以唯一地标识每个状态。这意味着在某些(大多数)修订中,存储库中只有 files/folders 的子集可能已更改。或者换句话说:如果您有一个文件处于两个不同的修订版,那么您唯一确定的是具有更高修订版的那个是来自整个存储库的较晚状态的文件 - 文件是否在两个修订版之间发生了变化不能仅从修订号推导出来。

关于您的包号方案:大多数打包版本的用户不关心某个包修订是从哪个 svn 修订创建的,因此 svn 修订通常从包修订名称中省略。我建议继续使用您的 MAJOR.MINOR.PATCH 编号方案。如果有疑问,我建议在 SO 上搜索相关问题。