在Windows中使用TortoiseSVN设置SVN外部引用

7
我正在尝试在Windows机器上使用TortoiseSVN设置svn:externals。我有两个项目,这两个仓库已经在同一台本地机器上创建好了。
当前的结构如下。我创建了repoArepoB用于存储仓库,workAworkB用于工作目录(检出)。 仓库

Z:\repos\repoA

Z:\repos\repoB

工作目录

Z:\Projects\workA\trunk\core.php

Z:\Projects\workA\trunk\lib\lib01.php

Z:\Projects\workB\trunk\core_mod.php

Z:\Projects\workB\trunk\lib\

(为了保持问题简单,省略了tagsbranches文件夹。)
我想要实现的是将workA\trunk\lib\目录下的文件,在这种情况下是lib01.php自动复制到workB\trunk\lib\目录中。
为了设置这个,我所做的是:
  1. 检出workA并将其分配给repoA,然后检出workB并将其分配给repoB
  2. 提交workA\trunk文件夹以使repoA最新。
  3. 为了为workB\trunk\lib分配导入位置,在workB文件夹上右键单击并选择TortoiseSVN -> Properties
  4. 点击New -> Externals并点击New...
  5. Local path表单字段中输入./trunk/lib。对于URL字段,输入file:///Z:/repos/repoA/trunk/lib。通过按下...按钮,repo-browser打开并帮助选择目标文件夹。

    enter image description here

    enter image description here

  6. 点击几次Ok关闭设置窗口。我假设外部设置已完成。

  7. 创建一个文件Z:\Projects\workB\trunk\core_mod.php
  8. 右键单击Z:\Projects\workB\trunk\并选择SVN ComitworkB提交到repoB

我期望此时,lib01.php会自动导入到Z:\Projects\workB\trunk\lib文件夹中,但没有复制任何内容。我还尝试通过右键单击workB\trunk文件夹来进行SVN Update。但是workB\trunk\lib文件夹仍然为空。

我怀疑相对路径./trunk/lib可能是错误的。我不知道。如果您能指出我的错误,我将不胜感激。

更新

6a - 将更改后的工作副本WorkB提交到repo

这是我的盲点。我右键单击Z:\Projects\workB并选择SVN Commit...,它给出以下错误。

enter image description here

点击“确定”按钮后,我立即收到一个对话框询问是否更新文件夹,我点击了“确定”。然后TortoiseSVN开始更新“Z:\Projects\workB”,但我收到了这个错误。但在此之后,当我重新提交“Z:\Projects\workB”时,它通过了,没有错误。
(在您的情况下,“trunk/lib”可能更加健壮)。
谢谢,当我重新选择“workB”文件夹的“属性”并单击“svn:externals”的“编辑”按钮时,TortoiseSVN自动将“./trunk/lib”调整为“trunk/lib”。现在已经设置好了。
6b-使用RepoB上的repobrowser测试(最快的方法),该定义是否正确
我右键单击“Z:\repos\repoB”,选择“TortoiseSVN -> repo-browser”,然后浏览到主干文件夹。它看起来如下所示。是否正确?我真的不知道,因为我从未处理过这个任务。在repo-browser中,主干文件夹下的lib文件夹为空。
“Z:\Projects\workB\trunk\lib”文件夹仍为空。错误消息建议重新定位“Z:\Projects\workB”,但我不确定它是什么意思。

Repo-Browser在trunk文件夹中显示了两个lib文件夹 - 一个是外部的,一个是真正的(不需要的)- 这是一个问题。请尝试使用完全递归的方式(包括外部依赖项)对trunk进行新的检出,以查看存储库的当前状态。 - Lazy Badger
Repo-Browser在trunk文件夹中显示了两个lib文件夹 - 一个是外部的,一个是真正的(不需要的) - 这是个问题。我在repo-browser中删除了真正的“lib”文件夹Z:\Projects\workB\trunk\lib,并在Z:\Projects\workB上执行了SVN Update。现在Z:\Projects\workB\trunk\lib\lib01.php已经自动创建了。这是一个漫长的解决之旅。 - Teno
2个回答

3

您忘记了至少一个必需操作

6a - 将修改后的工作副本WorkB提交到仓库

以及一个可选的检查点

6b - 在RepoB上使用repobrowser测试(这是最快的方式),确保定义是正确的

我不记得为什么,但我从不在TSVN中的路径规范中使用"./"来表示URL(在您的情况下,“trunk/lib”将更加坚固)。纯粹是个人习惯 - 即使结果会在根目录中获得一个聚合的定义,我也在挂载点处定义外部模块。

树形结构中带有外部模块和定义的仓库浏览器

Repo-Browser


0
对于任何遇到这个问题的人,workB的工作目录不需要导入文件夹。

Z:\Projects\workA\trunk\core.php

Z:\Projects\workA\trunk\lib\lib01.php

Z:\Projects\workB\trunk\core_mod.php

Z:\Projects\workB\trunk\lib\

必须是

Z:\Projects\workA\trunk\core.php

Z:\Projects\workA\trunk\lib\lib01.php

Z:\Projects\workB\trunk\core_mod.php

Z:\Projects\workB\trunk\

(无 Z:\Projects\workB\trunk\lib)


理论上,你是可以拥有一个真正的lib文件夹和其中的外部文件的,如果:1. 你为LIB文件夹创建外部定义;2. 挂载路径将是“.”。但我懒得测试了。 - Lazy Badger
有趣。听起来对我目前的理解水平来说有点复杂。可能这些信息对其他高级用户会有帮助。谢谢你的建议。 - Teno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接