English 中文(简体)
如何仅检出在一定范围的 SVN 版本修订中被修改的文件?
原标题:
  • 时间:2008-11-26 13:30:35
  •  标签:

有没有可能仅从SVN仓库中检出在修订或修订范围内进行了修改的文件,而不检出任何未被修改的文件?

最佳回答

My suggestion is in the same lines as flolo suggests. But, takes a range. You could the following shell function.

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
}
问题回答

据我所知,目前没有直接获取仅更改文件而不是所有文件的方法。

我的想法是:使用列表的冗长输出(显示最后更改的版本),通过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(或根据您运行命令的位置在URL上进行检出),或者进行检出。

EDIT: Additional even shorter: use the svn diff command, and replace with -x and --diff-cmd the diff command with svn co. This requires some argument shifting hacking (which I wont elaborate here), but needs just one line and no intermedate file (which you could save above too, but that would have cost readability)

如果您使用 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 命令。

我们在 MSBuild 脚本中执行此操作:

Step 1: - Use the diff command to get the list of modified files, redirect output into a temporary file in the target directory Step 2: - Read the temporary file into an itemGroup

<Exec command="$(svnExecutable) diff -r $(StartRevision):$(EndRevision) $(DOUBLE_QUOTES)$(SvnRepositoryPath)/$(DOUBLE_QUOTES) --no-diff-deleted --summarize &gt; $(TempFilePath)" WorkingDirectory="$(WorkDirectory)" />

我不完全确定这是否可能,但你也可以像这样做:

svn checkout --revision <revisionNumber> 

获取特定版本并

svn log --revision <revisionNumber> 

列出在修订中更改的所有文件

几乎与大多数人建议的相同(但仅限于 grep 和 awk 系统),您可以通过执行以下操作获取列表

svn日志 -v --修订版本号 | grep "^ " | awk {print $ 2} 的中文翻译为:

另一个回答你的问题:

假设您已经拥有了一个现有的工作副本,您只需在包含您要查看的文件的目录的根目录上使用 svn update 命令。这样可以用最少的数据检索出当前版和最新版之间的更改。

旧的源代码管理系统如CVS和VSS会询问服务器每个文件“这个文件改变了吗?”,而Subversion只会发送树的更改作为单个操作。当您传递文件列表给svn更新时,您就没有这个优势。

因此,将更改内容传输的最有效方式就是更新。这只会传输您的工作副本中 HEAD 与基础版本之间的二进制差异。


如果您要解决的问题是“svn update”过慢,那么我们正在尝试为Subversion 1.7解决该问题。

这个版本将介绍一种新的工作副本数据存储格式,它将使需要锁定整个工作副本(如更新)的简单操作更快。

svn diff -r 开始修订版本:结束修订版本或者HEAD --summarize





相关问题
热门标签