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

从Subversion签出一个文件

  •  306
  • bluegene  · 技术社区  · 17 年前

    “无法签出单个文件。最好的签出级别是目录级别。”

    在使用Subversion时,如何解决这个问题?

    我们把这个文件夹放在Subversion中,保存所有图像。我只想从中检出一个文件(图像)。这个文件夹真的很大,还有很多我现在不需要的东西。

    19 回复  |  直到 9 年前
        1
  •  384
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    简单的答案是你 svn export 而不是签出文件。

    但这可能不是你想要的。您可能希望处理该文件并将其重新签入,而不必下载不需要的GB垃圾。

    如果您有Subversion 1.5+,则执行稀疏签出:

    svn checkout <url_of_big_dir> <target> --depth empty
    cd <target>
    svn up <file_you_want>
    

    对于旧版本的SVN,您可能会从以下方面受益:

    • 当目录中没有你不需要的垃圾时,使用一个遥远的过去的修订来签出目录。
    • 更新所需文件,以创建混合修订。即使您签出的修订版中不存在该文件,也可以执行此操作。
    • 利润!

    另一种选择(例如,如果目录在创建它的修订版中有太多的垃圾邮件)是将您想要的文件的URL->URL副本复制到存储库中的新位置(实际上这是文件的工作分支)。查看该目录并进行修改。

    我不确定是否可以在没有目标工作副本的情况下将修改后的副本完全合并回存储库中-我从来没有必要这样做。如果是这样,那么就这么做。

    如果没有,那么不幸的是,你可能需要找其他人签出整个目录,让他们签出。或者,在您进行修改时,其他部分将完成下载…

        2
  •  105
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    尝试 svn export 而不是 svn checkout . 对单个文件有效。

    限制的原因是 checkout 创建一个工作副本,其中包含有关存储库、版本、属性等的元信息,元数据存储在名为“.svn”的子目录中。单个文件没有子目录。

        3
  •  52
  •   Nakilon earlonrails    14 年前

    使用 svn cat svn export .

    为此,您不需要获取工作目录,但您将无法提交所做的任何更改。如果您需要进行更改并提交它们,您需要一个工作目录,但不必完全获取它。签出目录仍然/几乎为空的修订,然后使用“svn cat”从head中提取文件。

        4
  •  12
  •   sth    16 年前

    如果您想在 不签出存储库:

    $VSN猫 http://svn.red-bean.com/repos/test/readme.txt
    这是一个自述文件。你应该阅读 这个。

    提示: 如果你的工作副本过期了 (或者您进行了局部修改)和 你想看一下 工作副本中的文件,SVN CAT 将自动获取头部 当你给它一个路径时:

    $CAT Foo.c
    这个文件在我的本地 工作副本并更改 我做了。

    $VSN猫fo.c
    最新版本 从存储库中!

    Source

        5
  •  8
  •   Peter Mortensen Pieter Jan Bonestroo    14 年前

    下面是一个Tortoissesvn等效的已接受答案的解决方案(因为我们新采用了svn,所以我已经在我公司的内部文档中写了这一点)。我想在这里分享一下也会有帮助:

    签出单个文件: Subversion不支持签出单个文件,它只支持签出目录结构。(参考文献: http://subversion.tigris.org/faq.html#single-file-checkout ) 这是因为对于作为工作副本签出的每个目录,有关修改/文件修订的元数据都存储为内部隐藏文件夹(.svn/svn)。对于单个文件,当前不支持此操作(v1.6)。

    备选建议策略:您只需执行一次签出目录部分,然后就可以直接去签出单个文件。对父文件夹和目录结构执行稀疏签出。稀疏签出基本上只是签出文件夹结构,而不填充内容文件。因此,您只签出目录结构,不需要像关注的那样签出所有文件。 参考文献: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

    步骤1 :转到存储库浏览器

    步骤2 :右键单击存储库中包含您要处理的所有文件的父文件夹,然后选择“签出”。

    步骤3 :在新弹出窗口中,确保签出目录指向本地PC上的正确位置。还将有一个标记为__checkout depth_157;的下拉菜单。选择_156;Only this item_157; or_156;immediate children,including folders_157;取决于您的要求。建议使用第二个选项,因为如果要处理嵌套文件夹,可以下次直接进行,否则必须对嵌套文件夹再次执行整个过程。

    步骤4 :父文件夹现在应该在本地选择的文件夹中可用,并且现在正由SVN(隐藏的文件夹__.SVN_157;或___SVN_157;现在应该存在)监视。现在,在存储库中,右键单击希望单独签出的单个文件,然后选择__update item to revision_157;选项。现在可以处理单个文件并将其签回存储库。

    我希望这有帮助。

        6
  •  6
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    您可以分两步完成:

    1. 签出仅包含元信息的空SVN存储库:

      $ cd /tmp
      
      $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
      
    2. svn up 要更新指定的文件:

      $ svn up http://svn.your.company.ca/training/trunk/sql/showSID.sql
      
        7
  •  5
  •   Mikkel Blanné    15 年前

    将文件包含在另一个文件夹的签出中可以覆盖您真正需要的更新。

    既然SVN 1.6你可以 file externals 一种SVN链接。这意味着您可以拥有包含单个文件的另一个版本化文件夹。也可以在签出此文件夹时提交对文件的更改。

    很简单,签出要包含文件的文件夹,然后简单地向文件夹添加属性。

    svn propedit svn:externals .
    

    内容如下:

    file.txt /repos/path/to/file.txt
    

    提交之后,文件将出现在文件夹的将来签出中。基本上是可行的,但是有一些限制,如上面链接的文档中所述。

        8
  •  4
  •   Dave Anderson    17 年前

    转到repo浏览器右键单击该文件并使用“另存为”,不过我使用的是Tortoissesvn。

        9
  •  4
  •   community wiki 2 revs, 2 users 69% anon    14 年前
    cd C:\path\dir
    svn checkout https://server/path/to/trunk/dir/dir/parent_dir--depth empty
    cd C:\path\dir\parent_dir
    svn update filename.log
    

    (编辑文件名.log)

    svn commit -m "this is a comment."
    
        10
  •  4
  •   Community Mohan Dere    9 年前

    Steve Jessop's answer 不适合我。我读了SVN的帮助文件,如果你只是有一个图片,你可能不想再次签入它,除非你在做photoshop,所以 出口 比签出更好的命令,因为它是未版本化的(但这是次要的)。

    以及 --深度 arg不应该是 空的 但是 文件夹 获取即时目录中的文件。所以你会得到所有的领域,不仅仅是一个,但是 空的 收益率 没有什么 从存储库中。

     svn co --depth files <source> <local dest>
    

    svn export --depth files <source> <local dest>
    

    至于其他答案, 允许您阅读仅对文本有效的内容,而不是所有内容的图像。

        11
  •  4
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    我只需要浏览它并导出单个文件。如果您有HTTP访问权,只需使用Web浏览器查找文件并获取它。

    如果你需要在编辑后把它放回原处,那可能会稍微有点乏味,但我相信可能会有一个 svn import 功能…

        12
  •  2
  •   Ted    17 年前

    如果您只想要一个没有修订信息的文件,请使用

    svn export <URL>
    
        13
  •  2
  •   jackr    17 年前

    使用Subversion 1.5,可以在不签出任何子目录(各种深度标志)的情况下签出(所有)目录的文件。不完全是你想要的,而是一种“比所有人都少”的形式。

        14
  •  1
  •   Daniel Brian Carlton    11 年前

    如果您只想导出文件,并且以后不需要更新它,那么您可以在不使用SVN命令的情况下进行更新。

    使用 Tortoissesvn存储库浏览器 ,选择文件,右键单击,然后选择“ 将URL复制到剪贴板 “。将该URL粘贴到您的浏览器中,登录后,系统将提示您下载文件。

    这样,您还可以选择所需的修订版并下载文件的旧版本。

    请注意,如果您的SVN服务器有一个Web界面,那么这是有效的。

        15
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    使用稀疏签出技术,您可以使用一个简单的技巧签出已经签出或存在的特定文件:

    使用“仅此项目”选项签出存储库的顶层后,在Windows资源管理器中,必须首先右键单击需要更新的文件;在上下文菜单中选择“repo browser”;在存储库浏览器中再次找到该文件,然后右键单击。现在,您应该可以在上下文菜单中看到“将项目更新为修订”。

    我不确定它是一个未记录的特性还是仅仅是一个bug。我下班后花了很长时间才找到这个诀窍。我在用 TortoiseSVN 1.6.

        16
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    我想将一个文件签出到一个目录中,该目录不是工作副本的一部分。

    让我们从以下URL获取文件: http://subversion.repository.server/repository/module/directory/myfile

    svn co  http://subversion.repository.server/repository/module/directory/myfile /**directoryb**
    

    所以我签出了包含目标文件的给定目录,我想得到一个虚拟目录(比如,etcb中以 /etc )

    然后我清空了文件 Svn/条目 从目标目录的所有文件中,我不需要,只留下我想要的文件。在这 Svn/条目 文件,每个文件都有一个带有属性的记录,因此只保留与要获取和保存的文件相关的记录。

    现在,您只需将“”复制到将是新的“工作副本”的目录。那么你只需要:

    cp .svn /directory
    cd /directory
    svn update myfile
    

    现在目录 目录 受版本控制。不要忘记删除目录 董事会 这只是一个“临时工作副本”。

        17
  •  1
  •   Peter Mortensen Pieter Jan Bonestroo    10 年前

    这样做:

    mkdir <your directory>/repos/test
    
    svn cat http://svn.red-bean.com/repos/test/readme.txt > <your directory>/repos/test/readme.txt
    

    基本上,这个想法是创建一个目录,从SVN中获取文件。 使用 svn cat 命令并将输出重定向到相同的命名文件。默认情况下,cat将在stdio上转储信息。

        18
  •  0
  •   ddkilzer    16 年前

    此问题包括:

    http://subversion.tigris.org/issues/show_bug.cgi?id=823

    附加了一个脚本,允许您从SVN签出单个文件、进行更改并将更改提交回存储库,但不能运行“svn up”签出目录的其余部分。已经用SVN-1.3、1.4和1.6进行了测试。

        19
  •  0
  •   LachoTomov    9 年前

    由于其他答案对我都不起作用,所以我就用这个方法:

    $ cd /yourfolder
    svn co https://path-to-folder-which-has-your-files/ --depth files
    

    这将创建一个新的本地文件夹,其中只包含来自远程路径的文件。 然后您可以在这里对您想要的文件进行符号链接。