我认为Subversion只能检出特定文件夹,而不能单独检出文件。不过,以下命令可以完成操作:
svn log -r *revision* -q -v
这个命令将列出与指定版本相关的更改,因此您可以处理此命令的输出,以帮助在检出完整目录的工作文件夹后将所需文件复制到某个地方。
svn diff -r [REVNUM]:HEAD --summarize > fileschanged.txt
我需要一个包含十几个版本范围内所有已更改文件的转储。我是这样做的(这些命令可能不完美,这只是一个一般性的解释):
创建一个差异,以显示您需要的文件,并将列表写入文本文件。
svn diff --summarize -r219:232 > r219-232_Summary.txt
M path/to/file.php
将文件格式进行更改,将每一行开头的'A '或'M '等替换成'svn up'命令。
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
我认为你在这里使用的“check out”一词可能是指它在CVS中的意义,也就是“svn update”。是这样吗?
如果是这样的话,你可以更新到你想要的特定版本:
svn update -r12345
甚至只是将那些文件回滚到该版本:
svn update -r12345 file1 file2 file3
虽然你需要使用其他建议中的一些方法从svn获取文件列表。
我知道这有点离题,但我使用TRAC来完成这个任务,它只导出两个版本之间修改的文件,并将它们作为zip归档文件按照原始目录结构进行保存。
#!/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 checkout
只能在目录级别下工作,而不能在文件级别下工作。当然,如果一个特定的变更集中的所有更改都来自同一个目录,则可以执行 svn checkout <url> <path> -r<revid>
。
您可以使用svn log -q -v -r123 url
检查受影响的文件列表。
如果您只想获取受影响的文件,可以针对每个文件使用svn cat urlToFile -r123 > myfile
。
svn co --depth=empty url dest
cd dest
svn up file1 file2 file3
编辑:这里的解决方案与接受答案(从Subversion检出一个文件)基本相同。
以下是一种方法。
svn co --depth empty svn://myrepository/mytrunk
cd mytrunk
svn diff -c[REVNUM] svn://myrepository/mytrunk | grep "Index:" | awk '{print $2}' | xargs -n 1 svn update --parents
awk 单行命令的输出是更改的文件列表,带有相对路径。如前所述,更新适用于单个文件,而检出适用于模块。'--parents'选项强制在必要时在您的工作副本中创建目录。
请注意,更新还具有“--changelist”选项(至少在v.1.7.1+中),但似乎没有做我想要的事情。