从Subversion检出一个文件
"无法检出单个文件。我们可以执行的最佳检出级别是在目录级别。"
使用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
提交此文件后,该文件将显示在该文件夹的将来签出中。基本上可以,但是有一些限制,如上面链接的文档所述。