Subversion:仅检出在特定提交期间受影响的文件

17
在Subversion中,如果您知道特定版本号,是否可能仅检出在特定提交期间受影响的文件?

1
我花了一整天的时间研究这个问题。最终,我发现的解决方案只适用于Windows,并且只适用于TortoiseSVN工具,但它完全解决了我的问题。因此,我不会在这里创建答案,但是这是一个链接,解释了它的工作原理:http://www.verysimple.com/blog/2007/09/06/using-tortoisesvn-to-export-only-newmodified-files/ - Travis
13个回答

14

我认为Subversion只能检出特定文件夹,而不能单独检出文件。不过,以下命令可以完成操作:

svn log -r *revision* -q -v

这个命令将列出与指定版本相关的更改,因此您可以处理此命令的输出,以帮助在检出完整目录的工作文件夹后将所需文件复制到某个地方。


如果您想为多个版本添加,请使用以下命令:svn log -r36169 -r36171 http://svn.collab.net/repos/svn/ - vsingh

4
您可以像这样获取自特定版本以来修改的文件列表:
svn diff -r [REVNUM]:HEAD --summarize > fileschanged.txt

然后创建一个脚本来检出fileschanged.txt中的每个文件。

似乎不起作用。 - Steven Lee

2

我需要一个包含十几个版本范围内所有已更改文件的转储。我是这样做的(这些命令可能不完美,这只是一个一般性的解释):

创建一个差异,以显示您需要的文件,并将列表写入文本文件。

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

如果一切顺利,那么Shell应该解析文本文件中的每个“svn up”命令,并仅填充您感兴趣的文件目录。

2

我认为你在这里使用的“check out”一词可能是指它在CVS中的意义,也就是“svn update”。是这样吗?

如果是这样的话,你可以更新到你想要的特定版本:

svn update -r12345

甚至只是将那些文件回滚到该版本:

svn update -r12345 file1 file2 file3

虽然你需要使用其他建议中的一些方法从svn获取文件列表。


2

我知道这有点离题,但我使用TRAC来完成这个任务,它只导出两个版本之间修改的文件,并将它们作为zip归档文件按照原始目录结构进行保存。


1
这是一个简单的Bash脚本版本。我使用了“搜索模式”来删除不必要的行。修订版本、存储库地址和目标路径作为参数给出,但也可以硬编码。
#!/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

1

svn checkout 只能在目录级别下工作,而不能在文件级别下工作。当然,如果一个特定的变更集中的所有更改都来自同一个目录,则可以执行 svn checkout <url> <path> -r<revid>


1

您可以使用svn log -q -v -r123 url检查受影响的文件列表。

如果您只想获取受影响的文件,可以针对每个文件使用svn cat urlToFile -r123 > myfile


1
如果您想要导出,这很好,但这不会进行适当的检出。 - hometoast

1
如果您正在使用最新版本的svn,则可以检出空文件夹,然后更新特定文件。
在获取选择文件列表后,
svn co --depth=empty url dest
cd dest
svn up file1 file2 file3

编辑:这里的解决方案与接受答案(从Subversion检出一个文件)基本相同。


1

以下是一种方法。

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+中),但似乎没有做我想要的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接