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

时间:2015-05-21 15:47:20

标签: svn version-control

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

看起来在提交修订版上执行“svn update”会将整个repo卷回到那个时间点,这不是我们想要的。我们只希望在提交中更改文件集。

“svn update”看起来它也可以带一个文件列表,所以我读过一些人推荐写一个脚本的帖子,该脚本接受“svn log”的输出并在“svn update”命令中使用它。除非有更好的方法,这是我要尝试的解决方案?如果没有,任何人都可以指向一个完成版本的脚本吗?

2 个答案:

答案 0 :(得分:0)

不幸的是,Subversion无法直接实现您的目标(不确定您使用的是哪个版本,但至少1.7不直接支持此版本)。因此,您最好的选择是使用svn log -qv来获取修订的文件列表。如果你在一个(现代的)Unix环境中就是这样的伎俩(注意svn log返回存储库路径):

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

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

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

修改:请注意,您仍需要将上述“脚本”(文件列表)中的结果提供给svn up -r <your rev>

答案 1 :(得分:0)

我看到grep-BDSM的一些(可能的)原生替代品

手工和更改列表

如果&#34; ......一小组文件......&#34;真的很小,你可以

  • 将此日志输出转换为文件,从文件列表中删除不需要的噪音,以获取所需文件的空格分隔列表
  • svn cl CLNAME...命令中使用此列表和--targets选项
  • svn up --cl CLNAME
  • 中使用已创建的更改列表

Mercurial,HGSubversion和模板

Mercurial可以(通过一些技巧)读取SVN存储库,它的日志输出更加灵活,它作为本机Windows应用程序存在(TortoiseHG作为GUI和hg in控制台),SVN的日志可以轻松翻译成Mercurial,并根据需要更改模板。即 - 您可以准备好使用svn st FILE1 FILE2 ... FILEN

的结果hg log -T命令

这将需要更多的工作和关注,但当| SVN will fail

时,Mercurial的分支合并也可以在将来节省大量的时间和健康。