从Subversion检出一个文件

时间:2020-03-06 14:36:33  来源:igfitidea点击:

"无法检出单个文件。我们可以执行的最佳检出级别是在目录级别。"

使用Subversion时如何解决此问题?

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

解决方案

使用svn cat或者svn export

为此,我们不需要获取工作目录,但是我们将无法提交所做的任何更改。如果需要进行更改并提交,则需要一个工作目录,但不必完全获取它。在目录仍然/几乎为空的地方检出修订版,然后使用'svn cat'从HEAD提取文件。

试试svn export而不是svn checkout。适用于单个文件。

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

If you want to view readme.txt in your
  repository without checking it out:
  
  $ svn cat
  http://svn.red-bean.com/repos/test/readme.txt

  This is a README file. You should read
  this.
  
  Tip:
  If your working copy is out of date
  (or you have local modifications) and
  you want to see the HEAD revision of a
  file in your working copy, svn cat
  will automatically fetch the HEAD
  revision when you give it a path:
  
  $ cat foo.c

  This file is in my local
  working copy  and has changes that
  I've made.
  
  $ svn cat foo.c

  Latest revision fresh
  from the repository!

来源

我只浏览它并导出单个文件。如果我们具有HTTP访问权限,则只需使用网络浏览器查找文件并进行抓取即可。

如果我们需要在编辑后重新将其恢复,那可能会有些乏味,但是我敢肯定可能会有svn import函数...

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

svn export <URL>

转到资源库浏览器,右键单击该文件,然后使用"另存为",尽管我使用的是TortoiseSVN。

简单的答案是,我们可以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复制到存储库中的新位置(实际上这是一个工作分支的文件)。签出该目录并进行修改。

我不确定是否可以将修改后的副本完全合并回存储库中,而无需使用我从未需要的目标的工作副本。如果是这样,那就这样做。

如果不是这样,那么不幸的是,我们可能必须找到确实检出整个目录的其他人并使他们执行此操作。或者,当我们进行修改时,其余的将完成下载...

使用Subversion 1.5,可以检出(所有)目录文件而无需检出任何子目录(各种--depth标志)。不完全是我们要的,而是一种"少于全部"的形式。

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

(编辑filename.log)

svn commit -m "this is a comment."

使用稀疏检出技术,我们可以检出一个已经检出或者存在的特定文件……有一个简单的技巧:

使用"仅此项目"选项检出存储库的顶层后,在Windows资源管理器中,我们必须首先右键单击需要更新的文件;否则,请单击"确定"。在上下文菜单中选择"回购浏览器";在资源库浏览器中再次找到该文件,然后单击鼠标右键。现在,我们应该在上下文菜单中看到"将项目更新到修订"。

我不确定这是一个未记录的功能还是一个错误。我花了很长时间才能找到这个技巧。我正在使用TortoiseSVN 1.6.2.

以下是可接受的答案的TortoiseSVN等效解决方案(由于我们新采用SVN,因此我已在公司内部文档中编写了此解决方案)。我认为在这里分享也是有帮助的:

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

推荐的替代策略:我们只需要执行checkout目录部分一次,之后我们就可以直接去结帐单个文件。对父文件夹和目录结构进行稀疏签出。稀疏签出基本上是只签出文件夹结构而不填充内容文件。因此,我们只签出目录结构,而不必签出所有文件。
参考:http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

步骤1:进入存储库浏览器

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

步骤3:在新的弹出窗口中,确保检出目录指向本地PC上的正确位置。还将出现一个标记为"结帐深度"的下拉菜单。选择"仅此项"或者"直接子项",包括文件夹,具体取决于要求。推荐第二种选择,因为如果我们要在嵌套文件夹上工作,则可以在下一次直接进行操作,否则,对于嵌套文件夹,我们将必须再次遵循整个过程。

步骤4:父文件夹现在应该在本地选择的文件夹中可用,并且正在通过SVN进行监视(现在应该存在隐藏文件夹.svn或者_svn)。现在,在存储库中,右键单击我们希望单独检出的单个文件,然后选择"将项目更新到修订"选项。现在可以处理单个文件,然后将其检回到存储库中。

我希望这有帮助。

此问题包括:

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

附带了一个脚本,该脚本可让我们从svn中检出单个文件,进行更改并将更改提交回存储库,但我们无法运行" svn up"来检出目录的其余部分。它已通过svn-1.3、1.4和1.6进行了测试。

史蒂夫·杰索普(Steve Jessop)的答案对我不起作用。我阅读了SVN的帮助文件,如果我们只有图像,除非我们正在使用Photoshop,否则可能不希望再次检入它,因此export是比未检出更好的命令,因为它未经版本控制(但这是次要的)。

--depth ARG不应为空,而应为文件,以便将文件保存在立即目录中。因此,我们将获得所有字段,而不仅仅是一个字段,而空字段则不会从存储库中返回任何内容。

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

或者

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

至于其他答案,cat可让我们阅读仅适用于文本而非所有事物图像的内容。

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

从SVN 1.6开始,我们可以使外部文件成为一种svn链接。这意味着我们可以拥有另一个包含单个文件的版本文件夹。也可以在此文件夹的签出中对文件进行更改。

非常简单,签出要包含文件的文件夹,然后向该文件夹中添加一个属性

svn propedit svn:externals .

内容如下:

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

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