导出仅从subversion维护目录结构中更改的文件

时间:2011-01-24 14:49:57

标签: svn tortoisesvn

当我右键单击我的本地工作副本并选择显示日志时。 TortoiseSVN向我显示了为该修订更改的每个文件的完整路径。 从tortoiseSVN界面我想做的是以下内容。

当我右键单击修订号并选择导出时。我希望它能导出文件,同时将它们保存在目录中。

这可能吗?

换句话说,我想只将我在上一次提交中更改的文件导出到我的硬盘上的文件夹中(这不是我的工作副本),但我不希望它们全部集中在父目录。我希望他们被复制,包括他们的相对路径。

5 个答案:

答案 0 :(得分:9)

我意识到这是一个非常古老的问题,但在这里回答将有助于人们像我一样搜索谷歌:

svn status | grep '^[ADMR]' | cut -b 8- | xargs -I '{}' cp --parents {} /temporary/destination/dir

答案 1 :(得分:2)

由于这是Google首次导出仅使用SVN更改文件的结果之一,因此我为Windows制作了批量版本。不是很复杂,因为我很少需要批量做某事,但它应该做的工作。 您需要在路径中使用svn.exe才能使用此功能。还要注意在目录变量中包含尾部斜杠。

@echo off
set maindir=C:\path\to\project\root\
set exportdir=C:\path\to\project\export\

:: Delete the export dir and create it again to get rid of the old files
rd %exportdir% /S /Q
md %exportdir%

:: Go to the svn directory
cd %maindir%

:: Go through all "svn status" results
FOR /f "tokens=*" %%G IN ('svn status') DO (call :copyfile "%%G")
GOTO :eof

:: Copy the files to the export directory
:copyfile
    :: We can't directly substr the file name, so we need to buffer it
    set line=%1

    :: substr the correct file name (character 9 to one before the end of the string)
    set filepath=%line:~9,-1%

    :: Copy the file (the asterisk means that it won't ask if directory or file)
    xcopy %maindir%%filepath% %exportdir%%filepath%* /H
    GOTO :eof

Linux命令有点更短。要么使用Joe的答案中看到的那个,要么使用更短的答案(找到here):

svn status | cut -c9-99999 | cpio -pvdmu /path/to/export

答案 2 :(得分:1)

BASH

假设你有一台带有SVN的开发服务器,但是在你的生产服务器上你没有SVN。 所以你开发和SVN导出,并将导出的网站上传到生产。

现在您进行了更改,但您不想rsync /上传整个导出 - 只需更改。

在开发服务器上:

(假设您使用svn checkout https://svn.server.com/web/sitename/trunk /path/to/sitename检出了开发站点,并假设开发站点文件位于HEAD)

cd /path/to/sitename/
zip /path/to/diff.zip $(svn diff --summarize -r 123:HEAD https://svn.server.com/web/sitename/trunk | awk '{ print $2 }' |  sed -e 's{https://svn.server.com/web/sitename/trunk/{{')

这将创建一个ZIP文件,其中包含已更改的文件[s] - 在完整的目录结构中 - 来自修订版123:HEAD。

如果出于某种原因你不想要HEAD,那么:

cd /path/to/sitename/
svn up -r:124
zip /path/to/diff.zip $(svn diff --summarize -r 123:124 https://svn.server.com/web/sitename/trunk | awk '{ print $2 }' |  sed -e 's{https://svn.server.com/web/sitename/trunk/{{')
svn up

(这会将DEV设置为所需的版本,抓取文件[s],然后返回HEAD)

答案 3 :(得分:1)

我没有写这个答案,而是添加了它,因为以前的高评价答案已被删除,因为链接已失效。我从dead link中提取的WebCite中提取了帖子。

因此,我将答案设置为社区Wiki。

在Windows资源管理器中,右键单击右窗格(文件和文件夹所在的位置),然后选择TortoiseSVN,然后选择Repo-Browser选项,如下面的第一个屏幕截图所示。

selecting the repository browser with tortoisesvn

这将打开一个对话框,您需要在其中输入存储库的URL,如下面的第二个屏幕截图所示。输入它,然后单击确定按钮。

enter the address for the repository

打开TortoiseSVN信息库浏览器后,右键单击文件/文件夹区域,然后选择“显示日志”选项。在下面的屏幕快照中,该箭头用红色箭头突出显示。

select the show log option

选择要导出其间所有已更改文件的两个修订。在下面的示例中,我选择了修订版68和修订版73。这意味着将导出在这两个修订版之间更改的所有文件(即,在修订版69、70、71、72和73中更改的所有文件)。现在,右键单击并选择“比较修订”选项。

select the revisions and compare

现在将显示所有已更改文件的列表,如下面的最终屏幕截图所示。在文件列表区域中单击并选择所有(Ctrl + A),右键单击并选择“将选择导出到...”选项,如屏幕快照中红色箭头所示。

showing changed files

单击选项后,系统将提示您将更改的文件导出到的位置。按照此过程进行操作,两个版本之间已修改的所有文件都将导出到指定的路径。

答案 4 :(得分:0)

不,这是不可能的。您可以导出该版本的整个存储库,也可以仅导出已展平路径的已更改文件。