从Subversion签出一个文件

“不可能签出一个文件,最好的签出级别是在目录级别。”

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

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

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

但这可能不是你想要的。 您可能需要处理该文件并重新检入,而无需下载不需要的垃圾文件。

如果你有Subversion 1.5+,那么做一个稀疏的结帐:

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

对于较早版本的SVN,您可以从以下方面获益:

  • 在遥远的过去使用一个修订版检查目录,当它不那么充满垃圾你不需要。
  • 更新你想要的文件,创build一个混合版本。 即使文件不存在于您签出的版本中,也可以使用。
  • 利润!

一个替代scheme(例如,如果该目录有太多的垃圾权是从它创build的修订版)是做一个URL->所需的文件的URL复制到存储库中的新地方(有效地这是一个工作分支的文件)。 看看那个目录并做你的修改。

我不确定是否可以将修改过的拷贝完全归并到存储库中,而不需要目标的工作副本 – 我从来不需要。 如果是的话就这样做。

如果不是,那么不幸的是,你可能不得不find其他人把整个目录检出来,并让他们去做。 或者,也许当你做了你的修改,其余的将完成下载…

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

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

使用svn catsvn export

为此,您不需要获取工作目录,但是您将不能提交任何更改。 如果您需要进行更改并提交,那么您需要一个工作目录,但是您不必完全获取它。 检出目录仍然/几乎为空的版本,然后使用'svn cat'从HEAD中提取文件。

如果你想在你的仓库中查看readme.txt而不检查它:

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

提示:如果您的工作副本已过期(或者您已经进行了本地修改),并且您希望在工作副本中查看某个文件的HEAD修订版本,那么svn cat会在您为其提供path时自动获取HEAD修订版本:

$ cat foo.c
这个文件在我的本地工作副本,并有我所做的更改。

$ svn cat foo.c
最新版本库修改!

资源

下面是一个接受答案的TortoiseSVN等效解决scheme(我已经在我公司的内部文档中为我们新近采用SVN写了这个解决scheme)。 我认为在这里分享也是有帮助的:

检出单个文件: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 :右键单击存储库中的父文件夹,其中包含您要处理的所有文件,然后select“签出”。

步骤3 :在新的popup窗口中,确保checkout目录指向本地PC上的正确位置。 还会有一个标签为“结帐深度”的下拉菜单。 根据您的要求select“仅此项目”或“直接子女,包括文件夹”。 build议使用第二个选项,如果要在嵌套文件夹上工作,则可以直接进行下一步操作,否则将不得不再次执行嵌套文件夹的整个过程。

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

我希望这有帮助。

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

由于SVN 1.6你可以使文件外部 ,一种svn链接。 这意味着您可以拥有另一个包含单个文件的版本化文件夹。 在这个文件夹的签出中提交文件更改也是可能的。

这很简单,签出你想要包括文件的文件夹,并简单地添加一个属性到文件夹

 svn propedit svn:externals . 

与这样的内容:

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

提交后,该文件将出现在将来的文件夹结帐。 基本上它可以工作,但是在上面链接的文档中有一些限制。

您可以分两步进行:

  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 

转到回购浏览器右键单击该文件并使用“另存为”,但我使用的是TortoiseSVN。

史蒂夫·杰索普的回答对我来说不起作用。 我阅读SVN的帮助文件,如果你只是有一个图像,你可能不想再次检查它,除非你正在做的Photoshop,所以出口是一个更好的命令比结帐,因为它是未版本(但是很小)。

而 – 深度 ARG不应该是空的,而是文件来获取直接目录中的文件。 所以你会得到所有的领域,而不是只有一个,但从仓库没有返回任何东西

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

要么

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

至于其他的答案, 可以让你阅读仅适用于文本的内容,而不是所有东西的图像。

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

如果你需要重新编辑它后,它可能会稍微更乏味,但我敢肯定,可能有一个svn importfunction…

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

如果你只想要一个没有修改信息的文件使用

 svn export <URL> 

使用Subversion 1.5,可以检出(全部)目录的文件而不检出任何子目录(各种–depth标志)。 不是你所要求的,而是一种“less于一切”的forms。

如果你只是想导出文件,而不需要稍后更新,你可以不用使用SVN命令。

使用TortoiseSVN版本库浏览器 ,select文件,右键单击,然后select“ 复制URL到剪贴板 ”。 将该URL粘贴到浏览器中,login后应提示文件下载。

这样,您也可以select所需的版本并下载该版本的旧版本。

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

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

在使用“仅此项”选项检出版本库顶层之后,在Windows资源pipe理器中,必须先右键单击需要更新的文件; 在上下文菜单中selectRepo Browser; 在版本库浏览器中再次find该文件,然后右键单击。 您现在应该在上下文菜单中看到“更新项目到修订”。

我不确定这是不是一个无证的function,或者只是一个错误。 我花了很长时间才终于find了这个诀窍。 我使用的是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,以/etc结尾的URL)。

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

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

 cp .svn /directory cd /directory svn update myfile 

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

做这样的事情:

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

基本上这个想法是创build你想从SVN抓取文件的目录。 使用svn cat命令并将输出redirect到同一个命名文件。 默认情况下,cat会转储stdio上的信息。

这个问题覆盖了:

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

有一个附加的脚本,可以让你从svn中检出单个文件,进行修改,并将修改提交回存储库,但是你不能运行“svn up”来检出其余的目录。 已经用svn-1.3,1.4和1.6进行了testing。

由于没有其他答案为我工作,我做了这个使用这个黑客:

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

这将创build一个新的本地文件夹,其中只有来自远程path的文件。 然后,你可以做一个符号链接到你想要在这里的文件。