如何才能检出在一系列SVN修订版中修改过的文件?

时间:2008-11-26 13:30:35

标签: svn revision svn-checkout

是否可以仅检出SVN存储库中那些在修订版或修订版范围内修改过的文件,而无需检出任何未修改的文件?

8 个答案:

答案 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 &gt; $(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

相关问题