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

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

我们在Subversion中有这个文件夹,用来保存所有的图像。我只是想从其中找出一个文件(图像)。这个文件夹真的很大,里面有很多我现在不需要的东西。


当前回答

我想将单个文件签出到一个目录,而该目录不是工作副本的一部分。

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

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

因此,我签出了包含目标文件的给定目录,我想要获得一个虚拟目录,(以/etc结尾的URL为etcb)。

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

现在你只需要复制。”到目录,这将是一个新的“工作副本”。然后你只需要:

cp .svn /directory
cd /directory
svn update myfile

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

其他回答

简单的答案是导出文件,而不是签出它。

但这可能不是你想要的。您可能希望处理该文件并将其签入,而不必下载不需要的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而不是svn checkout。这适用于单个文件。

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

我只需要浏览并导出单个文件。如果您有HTTP访问权限,只需使用web浏览器找到文件并获取它。

如果你在编辑后需要把它放回去,这可能会有点乏味,但我相信可能会有一个svn import函数……

如果您只是想导出文件,并且以后不需要更新它,您可以在不使用SVN命令的情况下完成此操作。

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

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

注意,如果您的SVN服务器有web界面,这是有效的。

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

在使用“this item only”选项签出存储库的顶层后,在Windows资源管理器中,你必须首先右键单击你需要更新的文件;在上下文菜单中选择Repo浏览器;在存储库浏览器中再次找到该文件,并单击右键。您现在应该在上下文菜单中看到“更新到修订的项目”。

我不确定这是一个未记录的特性还是一个bug。我在下班后花了很长时间才终于找到了这个诀窍。我使用的是TortoiseSVN 1.6.2。