从Subversion签出一个文件

时间:2008-09-23 16:26:32

标签: svn version-control

“无法检出单个文件。您可以在目录级别进行最精细的检查。”

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

我们在Subversion中有这个文件夹,我们保存所有图片。我只想查看一个文件(图像)。这个文件夹非常大,还有很多我现在不需要的东西。

19 个答案:

答案 0 :(得分:389)

简单的答案是你svn export文件而不是检查它。

但那可能不是你想要的。您可能希望处理该文件并将其重新签入,而无需下载您不需要的GB垃圾。

如果您有Subversion 1.5+,那么请进行稀疏结账:

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

对于旧版本的SVN,您可能会受益于以下内容:

  • 在遥远的过去使用修订版检查目录,当时它不再是你不需要的垃圾。
  • 更新所需文件,以创建混合版本。即使您检出的修订版中不存在该文件,这也可以正常工作。
  • 利润!

另一种选择(例如,如果目录中的垃圾邮件与创建它的版本相比太多)就是将所需文件的URL-&gt; URL副本放入存储库中的新位置(实际上这是是文件的工作分支)。查看该目录并进行修改。

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

如果没有,那么不幸的是,您可能必须找到其他人确实已经检查了整个目录并让他们这样做。或者也许在您进行修改时,其余部分将完成下载...

答案 1 :(得分:105)

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

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

答案 2 :(得分:53)

使用svn catsvn export

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

答案 3 :(得分:12)

  

如果你想查看你的readme.txt   存储库没有检查出来:

     

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

     

提示:   如果您的工作副本已过期   (或者您有本地修改)和   你想看到HEAD的修订版   文件在你的工作副本中,svn cat   将自动获取HEAD   当你给它一条路径时修改:

     

$ cat foo.c
  这个文件在我的本地   工作副本并进行了更改   我做了。

     

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

Source

答案 4 :(得分:8)

接受答案的TortoiseSVN等效解决方案(我在新公司采用SVN的内部文件中写了这个)。我认为在这里分享会很有帮助:

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

步骤3 :在新的弹出窗口中,确保结帐目录指向本地PC上的正确位置。还会有一个标有“结帐深度”的下拉菜单。根据您的要求选择“仅此项目”或“即时子项,包括文件夹”。建议使用第二个选项,如果要处理嵌套文件夹,可以在下次直接进行,否则必须再次对嵌套文件夹执行整个过程。

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

我希望这会有所帮助。

答案 5 :(得分:6)

您可以分两步完成:

  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 :(得分:5)

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

从SVN 1.6开始,你可以制作file externals,一种svn链接。这意味着您可以拥有包含单个文件的另一个版本化文件夹。也可以在签出此文件夹时提交对文件的更改。

这很简单,检查要包含文件的文件夹,只需在文件夹中添加属性

svn propedit svn:externals .

内容如下:

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

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

答案 7 :(得分:4)

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

如果您需要在编辑后重新启用它,那可能会稍微繁琐,但我确信可能有svn import函数...

答案 8 :(得分:4)

转到repo-browser右键单击该文件并使用“另存为”,我正在使用TortoiseSVN。

答案 9 :(得分: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."

答案 10 :(得分:4)

Steve Jessop's answer对我不起作用。我阅读了SVN的帮助文件,如果你有一个图像,你可能不想再检查它,除非你正在使用Photoshop,所以 export 是一个比checkout更好的命令,因为它是无版本的(但这很小)。

- 深度 ARG不应为空,而应文件以获取直接目录中的文件。因此,您将获得所有字段,而不仅仅是那个字段,但会从存储库中返回 nothing

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

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

至于其他答案, cat 可让您阅读仅适用于文字的内容,而不是所有内容的图片。

答案 11 :(得分:2)

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

svn export <URL>

答案 12 :(得分:2)

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

答案 13 :(得分:1)

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

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

我不确定它是无证件还是仅仅是一个bug。下班后我花了很长时间才终于找到了这个伎俩。我正在使用TortoiseSVN 1.6.2。

答案 14 :(得分:1)

如果您只想导出文件,以后不需要更新,则无需使用SVN命令即可完成。

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

这样您也可以选择所需的版本并下载旧版本的文件。

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

答案 15 :(得分:1)

做这样的事情:

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。

答案 16 :(得分:1)

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

让我们通过以下网址获取该文件: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 文件中,您有每个文件及其属性的记录,因此只留下有关要获取和保存的文件的记录。

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

cp .svn /directory
cd /directory
svn update myfile

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

答案 17 :(得分:0)

此问题包含在:

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

附加了一个脚本,允许您从svn签出单个文件,进行更改,并将更改提交回存储库,但是您无法运行“svn up”来检查目录的其余部分。它已经过svn-1.3,1.4和1.6的测试。

答案 18 :(得分:0)

由于其他答案都不适合我,我使用这个黑客做到了:

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

这将创建一个新的本地文件夹,其中只包含远程路径中的文件。 然后,您可以对要在此处拥有的文件进行符号链接。