有没有可能仅从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 > $(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
- winforms
- combobox
- fogbugz
- java
- date
- internationalization
- asp.net
- iis
- url-rewriting
- urlrewriter
- c#
- enums
- ocaml
- haxe
- algorithm
- string
- viewstate
- .net
- c++
- c
- symbol-table
- mysql
- database
- postgresql
- licensing
- migration
- vb.net
- vb6
- declaration
- vb6-migration
- python
- psycopg2
- backup
- vmware
- virtualization
- gnu-screen
- authentication
- desktop
- excel
- xll
- cultureinfo
- regioninfo
- oracle
- client
- session
- download
- html
- virtual
- constructor
- scenarios
- perl
- full-text-search
- javascript
- ajax
- testing
- oop
- inheritance
- vim
- encapsulation
- information-hiding