代码之家  ›  专栏  ›  技术社区  ›  Mecki

SVN:您可以只从本地签出(而不是从存储库)中删除目录吗?

svn
  •  47
  • Mecki  · 技术社区  · 15 年前

    假设您有一个受Subversion控制的目录,其中包含一些文件和大量子目录,如下所示:

    file1.txt
    file2.txt
    file3.txt
    dir1/
    dir2/
    dir3/
    dir4/
    :
    dirXX/
    

    现在你需要文件和一些目录,但不是全部。这可以通过SVN完成。只需使签出非递归:

    svn checkout -N <URL>
    

    这只检查第一个目录和其中的文件。不包括子目录。即使您进入签出目录并运行 svn up “,它只更新以前签出的文件,不添加目录。现在,您可以通过显式更新来有选择地添加所需的目录。例如,如果只需要dir2和dir4,可以进入checkout目录并执行

    svn up dir2
    svn up dir4
    

    如果你运行一个通用的 支持向量机 “将来,它只会更新文件和这两个目录,不会添加任何其他目录。

    现在的问题是:如果我以后决定不再需要dir2怎么办?我怎么摆脱它?除了删除整个签出并从头开始,似乎没有其他方法可以做到这一点。

    当你刚删除dir2时,下一个“ 支持向量机 “会把它带回来的,就像” svn status “当然,现在它显示为丢失(!”在它的名字前面)。运行a“ svn remove “当然会将其删除,但在下一次提交时,它也会将其从存储库中删除,这绝对不会发生。

    甚至SVN 1.5的新稀疏目录(“浅签出”)功能在这里也没有用处:

    颠覆1.5的实施 浅退房很好,但不行 支持一些有趣的 行为。首先,你不能 缩小工作副本项目。 运行svn update--设置深度为空 在无限深度的工作副本将 没有丢弃的效果 除了最上面的一切 目录“它只会出错。
    - http://svnbook.red-bean.com/en/1.5/svn.advanced.sparsedirs.html

    使用SVN是否完全不可能?有人想出过一个巧妙的办法吗?

    只需创建签出目录(不带SVN),然后直接从存储库中签出单独的子目录,作为该目录的子目录即可用于目录:现在每个目录都是其自己的签出,可以更新,一旦不再需要,只需删除即可。但是,如何获取文件(例如file1.txt)?SVN不允许签出单个文件,只能签出整个目录。

    5 回复  |  直到 6 年前
        1
  •  56
  •   Dave Jarvis James Eichele    6 年前

    我所要做的不能用颠覆1.4或颠覆1.5;句号。
    周围没有工作,这就是它存在的方式。

    不过,它可以用1.6版本来完成。

    与SVN 1.5不同,SVN 1.6可以 降低深度 在目录上

    svn up --set-depth exclude dir2
    

    是解决方案。它将dir2的深度设置为零,并且会立即从签出中消失,除非您再次将此目录的深度显式设置为一个值(或者只在没有深度选项的情况下对其进行更新,因为不提供深度总是意味着无穷大,除非您使用非递归,即“文件”)。

    提示:
    实际上,SVN 1.6不能像增加深度那样真正减小深度。您可以将它从任何级别提升到任何更高级别。您只能将其减少到“排除”(所有级别中的最低级别)。如果要从“无穷大”(最高)减少到“文件”(中间的某个位置),必须先将其减少到“排除”(导致目录消失),然后再将其增加到“文件”。这是一个有点黑客,但它工作得很好。

        2
  •  37
  •   CodingWithSpike    13 年前

    对于以后遇到这种情况并使用 龟龟 ,下面是如何做同样的事情…

    1. 右键单击您 不再想要 已签出(这是要排除的文件夹)
    2. 从上下文菜单中,选择“Tortoissesvn>更新到修订…”
    3. 在弹出的窗口中,将“更新深度”下拉框设置为“排除”
    4. 点击“确定”。SVN现在将自动从您的驱动器中删除该目录。

    (注:这是用Tortoissesvn 1.7.5完成的,其他版本可能有所不同。)

        3
  •  10
  •   leoger zOlive    15 年前

    更新:我正在运行SVN 1.6.11,我可以使用 svn up --set-depth empty dir 而是必须 exclude 目录。

        4
  •  2
  •   slowdog    15 年前

    使用Svn 1.6, --set-depth 就是答案。

    使用SVN<1.6,您可以通过滥用 svn switch :在存储库中的某个位置创建一个空目录,以及 switch 您现在不需要的子目录指向它,而不是它们的“真实”URL。

        5
  •  1
  •   petr k.    15 年前

    你可以试试这个 trick 涉及本地存储库和SVN: 外部 声明。

    不过,我自己也没试过。