是否可以仅检出SVN存储库中那些在修订版或修订版范围内修改过的文件,而无需检出任何未修改的文件?
答案 0 :(得分:2)
现在有了直接获取已更改文件的方法,而不是全部。
我的想法是:使用列表的详细输出(显示最后更改的版本),通过awk过滤它,然后检查其余部分。例如。要搜索版本42中更改的文件,我会使用此
VERSION=42
svn list -v -R -r $VERSION svn://... | awk "/^[ ]*$VERSION/ {print \$7}" > files_to_checkout
然后执行svn update -r $VERSION 'cat files_to_checkout'
(或者网址上的co,具体取决于您将运行命令的位置)。
编辑:额外更短: 使用svn diff命令,用svn co替换-x和--diff-cmd diff命令。这需要一些参数转移黑客攻击(这里我不会详细说明),但只需要一行而不需要中间文件(你也可以保存在上面,但是这样会有成本可读性)
答案 1 :(得分:2)
我的建议与flolo建议的相同。但是,需要一个范围。 你可以使用以下shell函数。
function checkout_files_in_revrange()
{
svn_url=$1;
start_rev=$2;
end_rev=$3;
for theCheckoutCanditate in `svn log -r $start_rev:$end_rev --verbose --incremental | grep " M " | cut -f5 -d' ' | cut -f3- -d/`
do
svn co $svn_url/$theCheckoutCandidate -q;
done
}
答案 2 :(得分:1)
如果将svn log与-v(详细选项)一起使用:
svn log -r <revision> -v <path>
您将获得包含已更改文件的输出:
r3 | ciaran | 2008-11-16 12:24:30 +0000 (Sun, 16 Nov 2008) | 1 line
Changed paths:
A /trunk/apache/apache.conf
A /trunk/application/controllers
Commit message goes here
你应该可以通过一些grepping等来操作它来产生一系列svn co命令。
答案 3 :(得分:1)
我们在MSBuild脚本中执行此操作:
步骤1: - 使用diff命令获取已修改文件的列表,将输出重定向到目标目录中的临时文件 第2步: - 将临时文件读入itemGroup
<Exec command="$(svnExecutable) diff -r $(StartRevision):$(EndRevision) $(DOUBLE_QUOTES)$(SvnRepositoryPath)/$(DOUBLE_QUOTES) --no-diff-deleted --summarize > $(TempFilePath)" WorkingDirectory="$(WorkDirectory)" />
答案 4 :(得分:0)
我不完全确定这是否可行,但您也可以这样做:
svn checkout --revision <revisionNumber>
获得某个修订和
svn log --revision <revisionNumber>
列出修订版中更改的所有文件
答案 5 :(得分:0)
回答你的问题的另一个想法:
假设您有一个现有的工作副本,您应该在包含您正在查看的文件的目录的根目录上使用'svn update',因为它可以准确地检索当前修订版和HEAD版本之间的更改。
较早的源代码管理系统(如CVS和VSS)要求服务器为每个文件更改此文件?,而subversion只是将树的更改作为单个操作发送。当您将文件列表传递给svn update时,您没有这个优势。
因此,转移更改内容的最有效方法就是更新。这只会传输HEAD中更改的二进制差异,而不是工作副本的基本版本。
如果您要解决的问题是 svn update 要慢,那么我们正试图解决Subversion 1.7的问题。
此版本将引入一种新的工作副本数据存储格式,该格式将使得必须更快地锁定整个工作副本(如更新)的简单操作。
答案 6 :(得分:0)
与大多数人建议的几乎相同,(但只有在具有grep和awk的系统中),您可以通过执行
来获取列表 svn log -v --revision <revision_number> | grep "^ " | awk '{print $2}'
。
答案 7 :(得分:0)
svn diff -r starting_revision:ending_revision_or_HEAD --summarize