SVN仅从存储库更新特定文件

时间:2013-11-15 14:58:23

标签: file svn ignore

这个存储库有很多千兆字节,其中99%是我不需要的。我想要做的是只获取/更新* .js * .css * .html .doc 和* .pdf文件。其余的都是巨大的,我想留在那里,不要浪费时间和磁盘空间,因为我不需要看它们,我永远不会改变它们。

我意识到svn:ignore功能不是我需要的,它只与被检入的内容和被忽略的内容有关。我也知道SVN中没有参数或设置我可以利用它来做我想做的事。

我发现,如果我右键单击我的SVN文件夹并选择“检查修改”,然后在下一个对话框中选择“检查存储库”,那么我会得到一个完整的文件列表有。然后,将“扩展”添加到列标题并按扩展名排序是一项简单的任务。然后我可以向下滚动并找到所有组合在一起的.js文件。

这是我的#fail发生的地方。如果我右键单击JS文件的 ONE 并选择UPDATE,那么它将使文件关闭并创建支持该文件所需的子目录层次结构。这正是我想要发生的事情。在这一点上,我跳到空中,以为我找到了我需要的东西。这不是一个麻烦的过程,我可以忍受这个。然后我选择了所有的JS文件并右键单击。我注意到的第一件事是出现的上下文菜单有更少的选项,这是令人不安的。但UPDATE选项就在那里,所以我不太担心。我选择UPDATE然后单击OK,就像我之前尝试的单个JS文件一样。接下来发生的事情是奇怪的事情。不是重复单个文件发生的过程,而是重复所有选定文件的过程,它会针对每个文件显示“已跳过”并报告已完成。每次都会发生这种情况我可以手动完成每个文件(这需要几个小时),但我不能一次完成所有文件。

帮助。我在虚拟机中执行此操作,而不是仅仅为了获取我不需要的文件的四倍大小。

2 个答案:

答案 0 :(得分:1)

对于延迟回答感到抱歉,有很多事情要发生,我也不得不花一些时间来完成这项工作。正如您已经指出的那样,没有直接的方法来进行“仅扩展结账”。但是有一种方法可以使用Subversion command-line tools和我编写的批处理脚本。它的工作原理是使用Subversion的sparse directories功能,它允许您指定结帐应具有的“深度”。通过指定empty的深度,将创建一个空的工作副本,并且实际上不会检出任何文件或文件夹。然后,您可以将update您选择的直接文件和文件夹从存储库中复制到该工作副本中。这允许创建您所追求的“仅限扩展结帐”。

我编写的脚本允许您在EXTENSIONS变量中指定多个以空格分隔的扩展名。然后扫描SVN_ROOT变量中指定的存储库以查找具有给定扩展名的文件。然后继续构建一个工作副本,该副本仅包含支持具有您指定的扩展名的文件所需的目录结构(使用上述方法)。我测试了很多,希望它能满足你的需求。

注意:根据存储库的大小和与指定扩展名匹配的文件数量,创建工作副本的过程需要一些时间。

@ECHO OFF
SetLocal EnableDelayedExpansion

SET SVN_ROOT=svn://your-repository.com/svn/your-project
SET EXTENSIONS=.js .css .html .doc .pdf
SET ROOT_DIR=%CD%

ECHO Listing repository...
svn -R ls %SVN_ROOT% > _files-all.txt

REM filter list for specified extensions
FOR %%H IN (%EXTENSIONS%) DO (
    TYPE _files-all.txt | FINDSTR /I /R "%%H$" >> _files-selected.txt
)

REM initial checkout in empty mode
svn co %SVN_ROOT% --depth empty .

FOR /F "tokens=*" %%I IN (_files-selected.txt) DO (
    REM "escape" path elements by wrapping them into double quotes
    SET TMP_PATH=%%I
    SET TMP_PATH="!TMP_PATH:/=" "!"
    ECHO Fetching %%I
    REM iterate over path elements
    FOR %%J IN (!TMP_PATH!) DO (
        REM "unescape" each path element again
        SET PATH_ELEM=%%J
        SET PATH_ELEM=!PATH_ELEM:~1,-1!
        REM if we don't have this element, fetch it from repository
        IF NOT EXIST "!PATH_ELEM!" (
            svn up %%J --depth empty 2>&1 > nul
        )
        REM if the element is a directory, enter it
        IF EXIST %%~sJ\NUL CD %%J
    )
    CD !ROOT_DIR!
)

REM clean up temporary files
DEL _files-all.txt _files-selected.txt

答案 1 :(得分:0)

我最终不得不放弃使用svn更新的梦想,该更新只能获取某些文件扩展名并将所有其他文件扩展名留在服务器上。我不得不接受我需要得到的全部内容,除非我希望每次更新都涉及导航大型树结构并仅选择我想要的子文件夹。