SVN外部文件未提交是否正常?

SVN外部文件未提交是否正常?,svn,tortoisesvn,svn-externals,Svn,Tortoisesvn,Svn Externals,我是Subversion的新手,最近学习了如何使用svn:externals自动导入属于其他存储库的文件。现在,当我提交trunk文件夹并创建一个标记来拍摄项目快照时,定义为externals的文件/文件夹将不会添加到标记文件夹中 例如,我有这个文件夹结构 Z:\repos\repoA Z:\repos\repoB Z:\Projects\workB 我已将Z:\Projects\workB上的svn:externals设置为file:///Z:/repos/repoA/trunk/lib tr

我是Subversion的新手,最近学习了如何使用
svn:externals
自动导入属于其他存储库的文件。现在,当我提交trunk文件夹并创建一个标记来拍摄项目快照时,定义为externals的文件/文件夹将不会添加到标记文件夹中

例如,我有这个文件夹结构

Z:\repos\repoA

Z:\repos\repoB

Z:\Projects\workB

我已将
Z:\Projects\workB
上的
svn:externals
设置为
file:///Z:/repos/repoA/trunk/lib trunk/lib
,以便
repoA
的lib文件夹自动添加到当前工作目录
Z:\Projects\workB\trunk
。实际上,当我执行
SVN Update
时,lib文件夹是在trunk文件夹下创建的

在编辑一些文件并在
Z:\Projects\workB\trunk
上执行
SVN Commit…
之后,我从上下文菜单中选择了
TortoiseSVN->Branch/Tag
。在路径字段中,键入标签/1.0.1并按OK。已成功创建1.0.1标记

在我对
Z:\Projects\workB\tags
执行
SVN Update
之后,出现了一个名为1.0.1的文件夹,但没有外部文件

这正常吗?我希望导入的文件也会在那里,因为它们位于工作目录的trunk文件夹中


我在Assembla创建了两个公共存储库供任何人测试


第二个存储库具有externals定义,它从第一个存储库中下拉
lib
文件夹。当我从第二个存储库创建当前主干文件的标记时,它不会将外部文件添加到标记文件夹中。另外,当我签出标记文件夹时,它不会将外部文件添加到本地工作副本。

您的期望是正确的。svn副本必须创建源对象的100%副本,即-外部定义(和内容)必须出现在标记中

  • 检查
    svn ls-v-Rfile:///Z:/repos/repoB/tags/1.0.1
  • 为了更容易检查和解决问题,我建议移动到公共可用的repo集-为了测试,例如,您可以在汇编上创建一个具有两个或更多SVN repo的空闲空间
  • 与问题无关注意:标记,按照惯例,用作代码冻结点(以后从任何点都可以得到完全相同的代码),但这意味着,您还必须将所有外部锁定到创建标记的状态。repos/repoA/trunk/lib是HEAD修订版,随着时间的推移而改变,标签1.0.1的相应修订版(link tag rev-lib rev)将丢失。阅读有关PEG修订的信息

    编辑

    在主干中扩展的回购协议。测试失败:

    >svn co https://subversion.assembla.com/svn/subversion-troubleshoot-b/trunk .
    A    core_mod.txt
    Checked out revision 4
    
    只是,在那里我还必须签出/lib文件夹

    Edit2

    对于subversion-Troubleshootball-b repo:应用于定义的修复,创建了正确写入的标记(),外部绑定到PEG修订版

    请参见主干和标记签出之间的差异

    z:\>svn co https://subversion.assembla.com/svn/subversion-troubleshoot-b/
    ...
    
    Fetching external item into 'subversion-troubleshoot-b\trunk\lib':
    A    subversion-troubleshoot-b\trunk\lib\lib01.txt
    Checked out external at revision 4.
    
    Fetching external item into 'subversion-troubleshoot-b\tags\1.0.1\lib':
    A    subversion-troubleshoot-b\tags\1.0.1\lib\lib01.txt
    Checked out external at revision 2.
    
    Checked out revision 7.
    

    如果以后要在链接的repo中更改lib,trunk将获得文件夹的最新内容1.0.1,subversion疑难解答中的lib修订版2将始终保持不变。设置externals属性时,trunk不会将文件从外部存储库复制到工作存储库。相反,它只是创建了一个关于将来从何处获取这些文件的“注释”

    因此,当您创建标记时,svn不需要复制外部链接的实际文件。相反,它只是复制“注释”。如果您要签出
    标记/1.0.1
    目录(或更新,如果它已经在本地签出),那么您会注意到,即使工作存储库中不存在这些文件,它也会正确地下拉相关外部文件

    编辑: 啊,我终于看到问题了。您可以在根目录而不是主干目录中设置外部文件

    查看svn的最佳方式是它只是一个文件系统,主干、标记和分支的整个概念只是概念性的概念,每个目录与下一个目录没有什么不同

    因此,当您将trunk复制到tags目录时,外部属性不会被传输,因为它们不是trunk目录的一部分(它们只表示将外部项目放入trunk)。要解决这个问题,您应该从根目录中删除外部属性并将它们添加到主干中。下次创建标记时,应传输外部属性

    以下命令:

    svn propget svn:externals file:///Z:/Projects/workB/trunk
    
    应输出:

    file:///Z:/repos/repoA/trunk/lib lib 
    

    你不应该对一个外部事件负责。向外部提交意味着它不是外部的,而是当前项目的活动部分。@Dunes-你完全、绝对、完全错了。提交到外部资源是允许的、可能的、必须的操作,此外,它与OP问题无关。我没有说这不可能,我只是说这是个坏主意。有无限多的事情是可能的,但都是坏主意。externals背后的概念思想是能够跟踪项目与其外部依赖项之间的版本依赖关系。它并不是用来帮助将多个存储库作为一个整体进行管理的工具。但你是对的,这与他的问题无关。我现在明白了。svn:外部是一个被滥用的黑客。如果你“拥有”所有项目的源代码,你真的不想把它们当作穷人的依赖管理系统。如果必须使用外部标记,请考虑仅使用外部标记,因为标记的源是谁。无法将工作副本回滚到以前的状态(外部仍然指向主干-您没有还原任何内容)令人恼火。您使用的是什么语言/工具?看看常春藤/梅文/努杰或类似的东西。相信我-svn:外部不是路径。@KBB
    您使用的是什么语言/工具?
    -目前我正在使用