从Subversion签出一个文件

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

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

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

340493 次浏览

使用svn catsvn export

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

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

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

如果您想查看您的readme.txt

$ SVN cat http://svn.red-bean.com/repos/test/readme.txt < br > 这是一个README文件。你应该阅读 这个。< / p > < p >提示: 如果你的工作副本已经过期 (或者您有局部修改)和 你想看到HEAD修订的 文件在您的工作副本,SVN cat 将自动获取HEAD 修正当你给它一个路径:

$ cat foo.c
这个文件在我的本地 工作副本,并已更改 我。< / p >

$ SVN cat foo.c
最新修订 来自存储库!< / p >

Source .

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

如果你在编辑后需要把它放回去,这可能会稍微繁琐一些,但我相信可能会有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."

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

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

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

以下是已接受答案的TortoiseSVN等效解决方案(我在公司的内部文档中写了这个,因为我们新采用了SVN)。我觉得在这里分享也会有帮助:

签出单个文件: Subversion不支持检出单个文件,它只支持检出目录结构。(参考:http://subversion.tigris.org/faq.html#single-file-checkout)。这是因为对于作为工作副本签出的每个目录,有关修改/文件修订的元数据存储为内部隐藏文件夹(.svn/_svn)。对于单个文件,目前(v1.6)不支持这一点。 < / p > 另一种建议策略:你只需要做一次签出目录部分,然后你可以直接去签出你的单个文件。对父文件夹和目录结构进行稀疏检出。稀疏签出基本上是只签出文件夹结构,而不填充内容文件。所以你只签出目录结构,而不需要签出所有的文件。 参考:http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html < / p >

步骤1:继续到存储库浏览器

步骤2:右键单击存储库中的父文件夹,其中包含您希望处理的所有文件,并选择Checkout。

步骤3:在新的弹出窗口中,确保签出目录指向本地PC上的正确位置。也会有一个下拉菜单标记为“结帐深度”。根据需要选择“仅此项目”或“直接子项,包括文件夹”。第二个选项是推荐的,如果你想要处理嵌套文件夹,你可以直接进行下一次,否则你将不得不对嵌套文件夹再次遵循整个过程。

步骤4:父文件夹现在应该在您本地选择的文件夹中可用,现在正被SVN监视(一个隐藏文件夹”。现在应该出现“Svn”或“_svn”)。现在,在存储库中,右键单击您希望单独签出的单个文件,并选择“Update Item to revision”选项。现在可以处理单个文件并将其签回存储库。

我希望这能有所帮助。

此问题已在第823期“svn checkout a single file”中解决。Eric Gillespie[1]最初于2002年7月27日报道。

附带的Perl脚本[2]允许您从svn签出单个文件,进行更改,并将更改提交回存储库,但是您不能运行&;svn up"以签出目录的其余部分。它已经在svn-1.3、1.4和1.6上进行了测试。

注意,最初托管在tigris.org上的Subversion项目被转移到了apache.org。第823期的原始URL在tigris.org上,这个不存在的URL[3]。互联网档案时光倒流机有这个原始链接[4]的副本。

1 - __abc0

2 - __abc0

3 - __abc0

4 - __abc0

史蒂夫·杰索普的回答对我没用。我读了SVN的帮助文件,如果你只有一个图像,你可能不想再次签入,除非你在做Photoshop,所以出口是一个比签出更好的命令,因为它是未版本的(但这是次要的)。

并且——深度 ARG不应该是,而是文件来获取直接目录中的文件。所以你会得到所有的字段,而不仅仅是一个,但是从存储库返回没有什么

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

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

至于其他答案,让你阅读的内容只适合文本,而不是所有事物的图像。

如果您真的需要更新,可以将该文件包含在另一个文件夹的签出中。

从SVN 1.6开始,你可以创建外部文件,一种SVN链接。这意味着您可以拥有另一个包含单个文件的版本化文件夹。还可以在签出此文件夹时向文件提交更改。

这非常简单,签出您想要包含文件的文件夹,并简单地向文件夹添加一个属性

svn propedit svn:externals .

内容如下:

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

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

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

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

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

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

然后我从目标目录中我不需要的所有文件中清空文件. svn /条目,只留下我想要的文件。在这个. 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
基本上,这个想法是创建您想要从SVN中获取文件的目录。 使用svn cat命令并将输出重定向到同名文件。默认情况下,cat将在stdio上转储信息

你可以分两步完成:

  1. 检出一个仅包含元信息的空SVN存储库:

    $ cd /tmp
    
    
    $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
    
  2. Run svn up to update specified file:

    $ svn up http://svn.your.company.ca/training/trunk/sql/showSID.sql
    

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

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

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

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

因为其他的答案都不适合我,所以我使用了这个方法:

$ cd /yourfolder
svn co https://path-to-folder-which-has-your-files/ --depth files
这将创建一个新的本地文件夹,其中只有来自远程路径的文件。 然后你可以在这里对你想要的文件做一个符号链接