Ben 和 David W 的帖子非常棒……感谢他们俩!他们的解释确实帮助我理解了主干、标签、分支如何存在于 SVN 服务器和 SVN 客户端上。除此之外,我有一些场景反映了上述答案并提供了额外的工作流程方法。
下面的场景显示了该文件夹上的本地文件夹结构和相关的 SVN 命令(缩进的文件夹是子文件夹)。另外,为简洁起见,我只显示了主干和分支文件夹(未显示标签文件夹)...为了便于讨论,可以添加标签文件夹并将其视为与分支文件夹完全相同。
场景A
这就是 O.P. 使用 SVN 的方式:
Project << svn co http://server/svn/Project
trunk
branches
branch1
branch2
...这会检出整个存储库的完整副本(主干加上所有分支加上所有标签)。在除“Project”之外的任何子文件夹中执行“svn switch”会导致混淆,因为(原始)“工作副本”已经在“Project”中,并且您最终会在同一棵树的两个不同文件夹中获得两个工作副本。因此,本上面关于永远不要切换的建议是有道理的。尽管如此,如果您从不切换(子文件夹),则使用此工作流程是完全有效的。
场景 B
这就是 Ben 在上面讨论的内容(“改变你结账的深度”):
...if you want to work on the trunk:
Project << svn co http://server/svn/Project/trunk
...if you want to work on branch2:
Project << svn switch http://server/svn/Project/branches/branch2
...所以一个文件夹(“项目”)会随着时间的推移改变其上下文,因为您每次都执行 svn checkout 或 svn 切换到不同的 URL。但是了解本地文件夹的工作环境并不是很明显。在 TortoiseSVN 中,您可以右键单击并选择“切换”来查看当前 URL(然后取消切换)或从命令行使用“svn info”,但这些都是额外的步骤。尽管如此,这听起来像是使用 SVN 的一种非常常见的方式。
场景C
这是 David W 在上面讨论的场景 B 的一个变体……这种方法使(视觉上)正在处理哪个主干/分支/标签更加明显:
Project_trunk << svn co http://server/svn/Project/trunk
Project_branch2 << svn co http://server/svn/Project/branches/branch2
...并且永远不要在上述本地文件夹上进行 svn 开关,因为这会导致混淆(例如,在 Project_branch2 上发出“svn switch http://server/svn/Project/trunk”会使本地 branch2 文件夹保存 repo 主干的内容)。无论如何,这种方法确实可以让您的本地文件夹包含的内容立即在视觉上显而易见。
场景 D
这是场景 A 和 C 的混合体,它使用项目名称将所有主干/标签/分支封装在一个顶级文件夹下,模仿 repo 上的结构:
Project << (no SVN checkout performed on this folder)
trunk << svn co http://server/svn/Project/trunk
branches << (no SVN checkout performed on this folder)
branch1 << svn co http://server/svn/Project/branches/branch1
branch2 << svn co http://server/svn/Project/branches/branch2
在这种方法中,您可以通过避免对“项目”进行 SVN 签出来避免获取整个仓库,并且通过避免对文件夹“分支”进行 SVN 签出来避免获取所有分支。因此,就像场景 C 一样,它是对分支或主干的选择性检出,但它仍然像场景 A 中一样反映 repo 的结构。我提出这个是因为这是我可视化本地结构的第一种方式(作为远程的镜像)结构的一致性)。我喜欢它如何反映存储库上的结构,但是如果这在工作流程中提供了更多的清晰度,则值得商榷,因为您必须记住“特殊规则”以避免签出并打开文件夹“项目”和“分支”。
我的(主观)结论是,最明显的工作流程是上面的 B 和 C,因为它们没有需要记住的特殊情况,但如果适合您,当然可以使用 A 和 D。无论如何,浏览这些场景帮助我想象和理解如何处理主干、标签和分支。希望对其他人有所帮助!