如何只更新旧 SVN 提交的文件?

How to only update the files from an old SVN commit?

有时我们只想将一小部分文件(全部来自提交)拉入我们的工作区,所有其他文件都来自 HEAD。我知道如何使用 "svn log" 获取此列表,但我不确定如何最好地让 SVN 只交换这些文件。

看起来对提交的修订做 "svn update" 会将整个回购回滚到那个时间点,这不是我们想要的。我们只希望在提交中更改文件集。

"svn update" 看起来它也可以获取文件列表,所以我读过一些人推荐编写一个脚本来获取 "svn log" 的输出并在 "svn update" 命令。除非有更好的方法,否则这就是我要尝试的解决方案?如果没有,谁能告诉我一个完整的脚本版本?

不幸的是,Subversion 不能直接实现你正在寻找的东西(不确定你使用的是什么版本,但至少 1.7 不直接支持这个)。因此,您最好的选择是使用 svn log -qv 来仅获取您修订的文件列表。如果你在(现代)Unix 环境中,像这样的东西就可以了(注意 svn log returns 存储库路径):

svn log -qv -r <your rev> | \
grep -v -e '\--' -e '^r' -e 'Changed paths' | \
awk '{print ;}' | \
sed -e 's,^<your repo prefix>,,'

您必须提供 <> 括号之间的位。第一行获取包含受影响文件的日志(并且没有提交消息)。随后的三个 grep 行从 svn log 输出中删除了所有不必要的内容。 awk 仅返回文件名(删除状态指示)并且 sed 行从文件名中删除存储库前缀(您必须检查 svn log 输出以查看那是什么值适用于您的存储库)。

如果您 运行 从工作目录的根目录执行此操作,您应该获取所有文件以进行提交。这仅使用通常在 Unix/Linux 系统上可用的实用程序。这个脚本可能会使用一些调整,以防状态指示包含意外的东西,或者如果你的提交包含移动或复制的文件(因为一些 svn 版本将原点添加到 svn log 输出,你将需要删除它也)。

编辑:请注意,您仍然需要将上面 "script" 的结果(文件列表)提供给 svn up -r <your rev>

我看到一些(可能的)native grep-BDSM

替代品

手工和更改列表

如果“...一小部分文件...”真的很小,您可以

  • 将此日志输出写入文件,从文件列表中删除不需要的噪音以获得所需文件的 space 分隔列表
  • 在带有 --targets 选项的 svn cl CLNAME... 命令中使用此列表
  • 使用 svn up --cl CLNAME
  • 中创建的更改列表

Mercurial、HGSubversion 和模板

Mercurial 可以(通过一些技巧)读取 SVN 存储库,它的日志输出更加灵活,它作为本机 Windows 应用程序存在(作为 GUI 的 TortoiseHG 和控制台中的 hg) ,SVN 的日志可以很容易地转换为 Mercurial 的,并且可以根据需要更改模板。 IE。 - 您可以准备使用 svn st FILE1 FILE2 ... FILEN 命令作为 hg log -T

的结果

这会需要更多的工作和关注,但是Mercurial的分支|合并也可以在以后节省很多时间和健康,when|if SVN will fail