在 Subversion 中,如果您知道特定的修订号,是否可以仅检查在特定提交期间受影响的那些文件?
13 回答
我认为 Subversion 签出只能签出特定文件夹而不是单个文件。也就是说,命令:
svn log -r *revision* -q -v
将列出与指定修订相关的更改,以便您可以处理此命令的输出,以帮助在签出完整目录的工作文件夹后将所需文件复制到某处。
您可以获得自特定修订以来修改的文件列表,如下所示:
svn diff -r [REVNUM]:HEAD --summarize > fileschanged.txt
然后创建一个脚本来检查 fileschanged.txt 中的每个文件
我知道这有点离题,但我使用 TRAC 来执行此操作,它仅将在 2 个修订之间修改的文件导出为 zip 存档,文件位于其原始目录结构中。
我认为您可能在这里使用 CVS 意义上的“签出”一词,即“svn 更新”。是对的吗?
如果是这样,那么您可以更新到您想要的特定修订:
svn update -r12345
甚至只是该修订版的那些文件:
svn update -r12345 file1 file2 file3
尽管您必须使用其他一些建议从 svn 获取文件列表。
svn checkout
仅适用于目录级别,不适用于文件级别。当然,如果特定变更集中的所有变更都来自同一个目录,那么您可以执行svn checkout <url> <path> -r<revid>
.
您可以使用 . 检查受影响文件的列表svn log -q -v -r123 url
。
如果您真的只想获取受影响的文件,您可以将svn cat urlToFile -r123 > myfile
其用于每个文件。
如果您使用的是最新版本的 svn,您可以签出一个空文件夹,然后更新特定文件。
在获得要选择的文件列表后,
svn co --depth=empty url dest
cd dest
svn up file1 file2 file3
编辑:与此处接受的答案几乎相同的解决方案:Checkout one file from Subversion
这是一种方法。
svn co --depth empty svn://myrepository/mytrunk
cd mytrunk
svn diff -c[REVNUM] svn://myrepository/mytrunk | grep "索引:" | awk '{打印 $2}' | xargs -n 1 svn 更新 --parents
awk one-liner 的输出是使用相对路径更改的文件列表。如前所述,更新适用于单个文件,而检出适用于模块。'--parents' 选项会根据需要强制在工作副本中创建目录。
请注意,更新也有一个“--changelist”选项(至少在 v.1.7.1+ 中),但它似乎没有做我想要的。
我需要转储在十几个版本范围内发生更改的所有文件。我是这样做的(这些命令可能并不完美,这只是一般解释):
创建一个将显示您需要的文件并将列表写入文本文件的差异
svn diff --summarize -r219:232 > r219-232_Summary.txt
这将为您提供一个文本文件,其中包含如下行
M path/to/file.php
按摩文件格式以用“svn up”命令替换每行的开头,而不是“A”或“M”或其他任何东西。
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 应该解析文本文件中的每个 '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 log -v -q -r rev
然后,您可以使用管道清理线条前面的标记,例如
sed -e "s/^ . / /" | egrep -v "Changed paths:|-----"
. 为了只获取文件,您可能会svn cat
按照 Nikolai 的建议使用。
[编辑以清理和简化 sed 管道。]
很抱歉复活了一个早已死去的问题,但它从来没有让我满意。
您可以使用 SVNKit 构建一个简单的工具来为您执行此操作。我找到了这个关于它的博客,并根据我的需要稍微修改了代码。直到今天,我在部署过程中都在使用它。
它执行导出而不是结帐,但我确信这将是一个简单的更改。
svn mergeinfo --show-revs 合格http://base.com.rev1 http://base.com.rev2
这将给出很多修改
现在您想查看每个修订版中的文件列表。因此,将修订列表复制到记事本或editplus中并修改以使其适合一行
svn log -r r33521 -r33762 -3456 -r5623 -q -v >>missedFiles.txt
注意:我有 118 次修订,但我无法正确获取文件列表。所以我通过分解修订的子集来运行上述命令