Answers:
简单的答案是您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复制到存储库中的新位置(实际上,这是一个有效的分支)的文件)。签出该目录并进行修改。
我不确定是否可以在没有目标副本的情况下将修改后的副本完全合并到存储库中,而我从来不需要。如果是这样,那就这样做。
如果不是这样,那么不幸的是,您可能必须找到确实检出整个目录的其他人并使他们执行此操作。或者,当您进行修改时,其余的内容将完成下载...
svn export
,如果知道我想要的文件,使用它比使用Web界面要简单。提问者已经在使用SVN,所以我想这取决于哪个客户端以及该客户端是否易于使用svn export
。我确实发现Web界面比svn ls
(
尝试svn export
代替svn checkout
。适用于单个文件。
限制的原因是checkout
创建了一个工作副本,其中包含有关存储库,修订版,属性等的元信息。该元数据存储在名为“ .svn”的子目录中。单个文件没有子目录。
svn
不会导出单个文件。
svn cat $url_to_file_in_repo > $local_file_name
。
如果要在存储库中查看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
来自存储库的最新修订版!
curl
或)wget
。
以下是可接受的答案的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”)。现在,在存储库中,右键单击您希望单独检出的单个文件,然后选择“将项目更新到修订”选项。现在可以处理单个文件,然后将其检回到存储库中。
我希望这有帮助。
通过将文件包含在另一个文件夹的签出中,可以涵盖您真正需要的更新。
从SVN 1.6开始,您可以将文件外部化,这是一种svn链接。这意味着您可以拥有另一个包含单个文件的版本文件夹。也可以在此文件夹的签出中对文件进行更改。
非常简单,签出要包含文件的文件夹,然后向该文件夹添加一个属性
svn propedit svn:externals .
内容如下:
file.txt /repos/path/to/file.txt
提交此文件后,该文件将显示在该文件夹的将来签出中。基本上可以,但是有一些限制,如上面链接的文档所述。
史蒂夫·杰索普(Steve Jessop)的答案对我不起作用。我阅读了SVN的帮助文件,如果您只有图像,除非您正在使用Photoshop,否则可能不想再次检入它,因此请导出是比未检出更好的命令,因为它未经版本控制(但这是次要的)。
而--depth ARG不应该是空的,但文件以获得在不久的目录中的文件。因此,您将获得所有字段,而不仅仅是一个字段,而空字段将不会从存储库中返回任何内容。
svn co --depth files <source> <local dest>
要么
svn export --depth files <source> <local dest>
至于其他答案,cat可让您阅读仅适用于文本而非所有事物图像的内容。
--depth empty
是,不应将其他文件检出,然后可以使用获得一个文件svn up <source/file>
。使用svn export
,则无需执行此操作,只需指定文件即可。
做这样的事情:
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上转储信息。
使用稀疏检出技术,您可以检出一个已经检出或存在的特定文件...一个简单的技巧:
使用“仅此项目”选项检出存储库的顶层后,在Windows资源管理器中,您必须首先右键单击需要更新的文件;在上下文菜单中选择“回购浏览器”;在资源库浏览器中再次找到该文件,然后单击鼠标右键。现在,您应该在上下文菜单中看到“将项目更新到修订”。
我不确定这是一个未记录的功能还是一个错误。我花了很长时间才下班才能找到这个窍门。我正在使用TortoiseSVN 1.6.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。
由于没有其他答案对我有用,因此我使用了此技巧:
$ cd /yourfolder
svn co https://path-to-folder-which-has-your-files/ --depth files
这将创建一个新的本地文件夹,其中仅包含来自远程路径的文件。然后,您可以在此处想要链接到文件。
svn co
了一个文件,以避免整个目录中充满图像文件。另外,添加符号链接只会增加复杂性,从临时目录移动可能会起作用,但是您仍然必须仅检查一张图片的整个图片目录。@ steve-jessop有个正确的主意
此问题包括:
http://subversion.tigris.org/issues/show_bug.cgi?id=823
附带了一个脚本,该脚本可让您从svn中检出单个文件,进行更改并将更改提交回存储库,但您无法运行“ svn up”来检出目录的其余部分。已通过svn-1.3、1.4和1.6进行了测试。
svn up
计算机上的本地目录。