Svn Subversion:仅签出在特定提交期间受影响的文件

Svn Subversion:仅签出在特定提交期间受影响的文件,svn,revision,svn-checkout,Svn,Revision,Svn Checkout,在Subversion中,如果您知道特定的修订号,是否可以仅签出在特定提交期间受影响的文件?svn签出仅在目录级别工作,而不是在文件级别工作。当然,如果特定变更集中的所有更改都来自同一目录,那么您可以执行svn checkout-r我认为Subversion签出只能签出特定文件夹,而不能签出单个文件。这就是说,命令: svn log -r *revision* -q -v 将列出与指定版本相关的更改,以便您可以处理此命令的输出,以便在签出完整目录的工作文件夹后帮助将所需文件复制到某个位置。您可

在Subversion中,如果您知道特定的修订号,是否可以仅签出在特定提交期间受影响的文件?

svn签出
仅在目录级别工作,而不是在文件级别工作。当然,如果特定变更集中的所有更改都来自同一目录,那么您可以执行
svn checkout-r

我认为Subversion签出只能签出特定文件夹,而不能签出单个文件。这就是说,命令:

svn log -r *revision* -q -v

将列出与指定版本相关的更改,以便您可以处理此命令的输出,以便在签出完整目录的工作文件夹后帮助将所需文件复制到某个位置。

您可以使用
svn log-q-v-r123 url查看受影响文件的列表


如果您真的只想获取受影响的文件,可以对每个文件使用
svn cat urlToFile-r123>myfile

您可以使用
svn log-v-q-r rev
仅获取特定更改中的文件列表,然后您可以使用类似
sed-e“s/”的管道清理行前面的标记| egrep-v“更改路径:|-------”
。为了只获取文件,您可能会按照Nikolai的建议使用
svncat


[编辑以清理和简化sed管道。]

如果您使用的是最新版本的svn,则可以签出空文件夹,然后更新特定文件

获取要选择的文件列表后

svn co --depth=empty url dest
cd dest
svn up file1 file2 file3

编辑:与此处接受的答案几乎相同:

我知道这有点离题,但我使用TRAC来完成此操作,它仅将在两次修订之间修改的文件导出为zip存档,文件位于原始目录结构中。

我认为您可能在此处使用CVS意义上的“签出”一词,即“svn更新”。是这样吗

如果是,则可以更新到所需的特定版本:

svn update -r12345
甚至只是那些修订版的文件:

svn update -r12345 file1 file2 file3

尽管您必须使用其他一些建议从svn获取文件列表。

很抱歉,重新提出了一个早已过时的问题,但它的回答从未让我满意

您可以使用SVNKit构建一个简单的工具来完成这项工作。我发现了这一点,并根据我的需要稍微修改了代码。直到今天,我还在部署过程中使用它


它不会导出而不是签出,但我相信这将是一个简单的更改。

您可以得到一个文件列表,其中包含了如下特定修订:

svn diff -r [REVNUM]:HEAD --summarize > fileschanged.txt

然后创建一个脚本来签出filechanged.txt中的每个文件,这里有一种方法

svn co——深度为空svn://myrepository/mytrunk

cd mytrunk

svn差异-c[REVNUM]svn://myrepository/mytrunk |grep“Index:| awk'{print$2}'| xargs-n1svn更新--父

awk one liner的输出是一个文件列表,这些文件随相对路径而更改。如前所述,更新对单个文件有效,而签出对模块有效。“--parents”选项根据需要强制在工作副本中创建目录

请注意,更新也有一个“--changelist”选项(至少在v.1.7.1+中是这样),但它似乎并没有达到我想要的效果。

svn mergeinfo--show revs qualifiedhttp://base.com.rev2

这将给出很多修改

现在,您希望看到每个修订版中的文件列表。 因此,将修订列表复制到记事本或editplus中,并进行修改,使其与一行内容相匹配

svn log-r r33521-r33762-3456-r5623-q-v>>missedFiles.txt


注意:我有118个修订版本,无法正确获取文件列表。因此,我通过将修订分为子集来运行上述命令。我需要转储在十几个修订范围内更改的所有文件。我是这样做的(这些命令可能并不完美,这只是一个一般性的解释):

创建一个显示所需文件的diff,并将列表写入文本文件

svn diff --summarize -r219:232 > r219-232_Summary.txt
这将为您提供一个文本文件,其中包含以下行

M      path/to/file.php
svn up path/to/file.php
调整文件格式,用“svn up”命令替换每行的开头,而不是“A”或“M”或其他任何命令

 sed -i 's/A      /svn up /g' ./r219-232_Summary.txt
。。。这会让你产生像这样的线条

M      path/to/file.php
svn up path/to/file.php
创建一个新目录并将项目签出到它

svn co http://www.repo.net/whatever
删除目录中除.svn文件以外的所有内容(我使用的是一个相对较新的svn客户端,因此如果您使用的是一个旧的svn客户端,每个目录中都有一个.svn,则不确定该如何工作)

复制文本文件,使其可执行,并将其作为脚本运行

cp /path/to/wherever/r219-232_Summary.txt ./r219-232_Summary.sh
chmod 777 ./r219-232_Summary.sh
./r219-232_Summary.sh

如果一切按计划进行,那么shell应该解析文本文件中的每个“svn up”命令,并用您感兴趣的文件填充目录。

下面是一个简单的bash脚本版本。我使用“搜索模式”删除不必要的行。版本、存储库地址和目标路径作为参数提供,但可以硬编码

#!/bin/bash

REVISION=${1}
REPOSITORY="${2}"
DEST_PATH="${3}"
SEARCH_PATTERN="trunk"
FILES=$(svn log -q -v  $REPOSITORY -r $REVISION | grep $SEARCH_PATTERN)

mkdir -p $DEST_PATH
for FILE in $FILES ; do
    if [[ $FILE == *"$SEARCH_PATTERN"* ]]
    then
          FOLDER=$(dirname $FILE)
          mkdir -p $DEST_PATH/$FOLDER
      svn export -r $REVISION $REPOSITORY/$FILE $DEST_PATH/$FOLDER
    fi
done

#EOF

如果您想导出,这将很好,但这不会进行正确的签出。
svn cat
不是签出过程
xargs
在这里可能很有用。我花了很多时间研究这个问题。最终,我发现的解决方案仅适用于Windows,并且特定于TortoiseSVN工具,但它完全解决了我的问题。因此,我不会在这里创建一个答案,但这里有一个链接,指向解释其工作原理的文章:添加如果您想为多个版本执行svn log-r36169-r36171,该链接在6年前说了什么?