从Subversion检出一个文件


320

“无法检出单个文件。您可以执行的最佳检出级别是在目录级别。”

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

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


您可以用其他方式做到。登录生产服务器和svn up计算机上的本地目录。
Neocortex 2014年

Answers:


403

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

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

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


13
真正简单的解决方案是使用Web浏览器访问存储库。
支石墓

11
@dolmen-假设不需要修改文件(并且假设该存储库正在运行Web界面)。我使用命令行SVN,因此对我来说svn export,如果知道我想要的文件,使用它比使用Web界面要简单。提问者已经在使用SVN,所以我想这取决于哪个客户端以及该客户端是否易于使用svn export。我确实发现Web界面比svn ls
Steve Jessop 2010年

2
如果您的Subversion服务器支持,SmartSVN Client将锁定单个文件。而且,有一些钩子要求在签入二进制/可执行文件之前必须先签出。要让两个人修改二进制罚款并将这些更改合并在一起并没有什么意义。这些可能是当提出此问题时不可用的新功能。
TamusJRoyce 2011年

@Tamus:“这真的没有道理”,但在我描述的情况下,合并只是为了使新版本恢复到原始位置。预计二进制文件在合并目标中没有被修改。因此,除了用新版本替换旧版本外,文件本身不需要任何“合并”,这就是SVN所称的名称,它可以记录更改的来源以供将来参考。没错,可以通过在持续时间内锁定文件来避免冲突。
史蒂夫·杰索普

1
TortoiseSVN可以检出单个文件。我相信,要实现这一目标,它在幕后做了同样的事情。
Mike Starov

109

尝试svn export代替svn checkout。适用于单个文件。

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


2
注意:极老的版本svn不会导出单个文件。
MladenJablanović2011年

5
如果您只是想在部署过程中获取特定脚本的最新版本,则这是一种更好的方法。
william.berg 2013年

2
甚至在2011年,这种警告就是一个延伸,但是非常老的版本可以做到svn cat $url_to_file_in_repo > $local_file_name
cprn

53

使用svn catsvn export

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


svn cat svn://.../my_file.txt正是我想要的。我在svn://唯一(没有http://)存储库中工作,它看起来最新的websvn接口没有提供原始文件下载(或者我们配置错误,或者我是盲目的)。更容易做到这一点的方式比checkout+ up只是下载文件。
ribamar

12

如果要在存储库中查看readme.txt而不检出它:

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

提示:如果您的工作副本已过期(或您进行了本地修改),并且希望在工作副本中看到文件的HEAD修订版,则在给svn cat提供路径时,svn cat将自动获取HEAD修订版:

$ cat foo.c
该文件在我的本地工作副本中,并且已进行更改。

$ svn cat foo.c
来自存储库的最新修订版!

资源


您也可以直接使用任何HTTP客户端。您的网络浏览器或命令行工具(例如curl或)wget
支石墓

9

以下是可接受的答案的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:右键单击存储库中包含您要处理的所有文件的父文件夹,然后选择Checkout。

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

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

我希望这有帮助。


8

您可以分两个步骤进行操作:

  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
    

6

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

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

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

svn propedit svn:externals .

内容如下:

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

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


4

转到资源库浏览器,右键单击该文件,然后使用“另存为”,不过我正在使用TortoiseSVN。


4
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."

4

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

--depth ARG不应该是空的,但文件以获得在不久的目录中的文件。因此,您将获得所有字段,而不仅仅是一个字段,而字段将不会从存储库中返回任何内容

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

要么

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

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


1
的要点--depth empty是,不应将其他文件检出,然后可以使用获得一个文件svn up <source/file>。使用svn export,则无需执行此操作,只需指定文件即可。
凯文·维米尔

@reemrevnivek-你是对的。很好的问题是只需要一个文件,即使没有空整个目录结构文件也可以正常工作。
瓦斯

4

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

如果您需要在编辑后重新将其恢复,那可能会有些单调乏味,但是我敢肯定可能会有一个svn import功能...


3

做这样的事情:

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命令并将输出重定向到相同的命名文件。默认情况下,猫会在stdio上转储信息。


2

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

svn export <URL>

2

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


2

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

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

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


2

我想将单个文件检出到目录中,该目录不属于工作副本。

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

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

因此,我签出了给定目录,其中包含要进入虚拟目录的目标文件(例如,etcb表示URL的结尾) /etc)。

然后,我从不需要的目标目录的所有文件中清空文件.svn / entries,仅保留所需的文件。在此.svn /条目文件中,每个文件都有一条记录及其属性,因此只保留与要获取和保存的文件有关的记录。

现在,您只需要将“ .svn”复制到将成为新“工作副本”的目录中。然后,您只需要:

cp .svn /directory
cd /directory
svn update myfile

现在目录目录处于版本控制之下。不要忘记删除只是“临时工作副本” 的目录directoryb


这不是稀疏结帐吗?您确实不应该手动修改.svn目录中的文件。
Lasse V. Karlsen '02年

也许可以,但是它可以正确解决问题。我想这就是版本管理的工作方式,也很想将文件作为目录扩展​​来处理。尝试一下,告诉我逻辑有什么问题。我建议颠覆开发团队使用此功能扩展svn实用程序,它将解决所有回答此线程的人的问题。
hendergassler 2012年

2

由于没有其他答案对我有用,因此我使用了此技巧:

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

这将创建一个新的本地文件夹,其中仅包含来自远程路径的文件。然后,您可以在此处想要链接到文件。


OP询问svn co了一个文件,以避免整个目录中充满图像文件。另外,添加符号链接只会增加复杂性,从临时目录移动可能会起作用,但是您仍然必须仅检查一张图片的整个图片目录。@ steve-jessop有个正确的主意
Chris Marotta

2
OP的@ChrisMarotta在9年前问了这个问题。这里没有人在回答OP。这是解决此类问题的一般主题,与原始OP无关。人们来这里是为了解决自己的问题。当他们阅读它时,其中一些人将是我唯一合适的解决方案。这就是为什么我发布它。
Lacho Tomov

1
我很高兴获得这个答案,它对我
有所


1

如果您只想导出文件,而以后又不需要更新,则可以在不使用SVN命令的情况下进行操作。

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

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

请注意,如果您的SVN服务器具有Web界面,则此设置有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.