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

时间:2009-06-09 16:39:08

标签: svn revision svn-checkout

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

13 个答案:

答案 0 :(得分:12)

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

svn log -r *revision* -q -v

将列出与指定修订关联的更改,以便您可以处理此命令的输出,以帮助在检出完整目录的工作文件夹后将所需文件复制到某处。

答案 1 :(得分:4)

您可以获得自特定修订版以来修改过的文件列表,如下所示:

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

然后创建一个脚本来检查fileschanged.txt中的每个文件

答案 2 :(得分:2)

我知道它有点offtopic但我使用TRAC执行此操作并且它仅将2个修订版之间修改的文件导出为zip存档,其文件位于其原始目录结构中。

答案 3 :(得分:2)

我认为您可能在CVS意义上使用“结帐”一词,即“svn更新”。是吗?

如果是,那么您可以更新到您想要的特定修订版本:

svn update -r12345

甚至只是那些修订版的文件:

svn update -r12345 file1 file2 file3

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

答案 4 :(得分:1)

svn checkout仅适用于目录级别,而不适用于文件级别。当然,如果特定变更集中的所有更改都来自同一目录,那么您可以执行svn checkout <url> <path> -r<revid>

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

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

获取要选择的文件列表后

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

编辑:与此处接受的答案几乎相同的解决方案:Checkout one file from Subversion

答案 7 :(得分:1)

这是一种方法。

svn co --depth empty svn:// myrepository / mytrunk

cd mytrunk

svn diff -c [REVNUM] svn:// myrepository / mytrunk | grep“索引:”| awk'{print $ 2}'| xargs -n 1 svn update --parents

awk one-liner的输出是用相对路径更改的文件列表。如前所述,更新适用于单个文件,而结帐适用于模块。 “ - parent”选项会根据需要强制在工作副本中创建目录。

请注意,update也有一个'--changelist'选项(至少在v.1.7.1 +中),但它似乎没有做我想要的。

答案 8 :(得分:1)

我需要转储在十几个修订版本中已更改的所有文件。我是这样做的(这些命令可能不完美,这只是一般性解释):

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

svn diff --summarize -r219:232 > r219-232_Summary.txt

这将为您提供一个包含

等行的文本文件
M      path/to/file.php

按下文件格式,用“svn up”&#39;替换每行的开头。命令,而不是&#39; A&#39;或者&#39; M&#39;或者其他什么。

 sed -i 's/A      /svn up /g' ./r219-232_Summary.txt

...这会给你像

这样的行
svn up path/to/file.php

创建一个新目录并检查项目

svn co http://www.repo.net/whatever

删除除.svn文件以外的目录中的所有内容(我使用的是一个相对较新的svn客户端,所以如果您在旧的svn客户端上,每个目录中都有.svn,不知道如何会工作)

rm -rf ./*

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

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

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

答案 9 :(得分:1)

这是一个简单的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

答案 10 :(得分:0)

您可以使用

svn log -v -q -r rev

获取特定更改中的文件列表。然后,您可以使用以下方法清除行前面的标记管道

sed -e "s/^ . / /" | egrep -v "Changed paths:|-----"

。为了获得文件,您可能会使用Nikolai建议的svn cat

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

答案 11 :(得分:0)

很抱歉重新提出一个长期存在的问题,但我从来没有回答过这个问题。

您可以构建一个使用SVNKit为您执行此操作的简单工具。我发现了这个blog,并根据我的需要略微修改了代码。我现在正在部署过程中使用它。

它导出而不是结帐,但我确信这将是一个简单的更改。

答案 12 :(得分:0)

svn mergeinfo --show-revs符合条件的http://base.com.rev1 http://base.com.rev2

这将进行大量修改

现在,您希望查看每个修订版中的文件列表。 因此,请将修订列表复制到记事本或editplus并进行修改,以便它们适合一行

svn log -r r33521 -r33762 -3456 -r5623 -q -v&gt;&gt; missedFiles.txt

注意:我有118个修订版,但我无法正确获取文件列表。所以我通过打破修订版

的子集运行上面的命令