更新svn

时间:2017-03-08 20:05:53

标签: svn version-control

动机

我最近和SVN玩了一会儿。我面临的问题如下:

  • 人员1检查项目A部分的一些更改,创建修订版r100
  • Person 2检查主干,编译项目的B部分,并检查更多内容,创建修订版r101
  • Person 3检出主干,编译项目的A部分,并意识到Person 1忘记检入新引入的文件a.txt。第3个人向第1个人投诉。
  • 第1人添加并提交其他文件a.txt,创建修订版r102
  • 很久以后,Person 4决定检查某个特定功能是否在修订版r101中的项目A部分中起作用,并意识到项目的A部分由于缺失而无法在r101中编译文件。

这是有些人会认为是轻微的滋扰以及有些人会认为是一场重大灾难。但无论这有多糟糕,我目前正在编写一些代码来抓取(相当大的)SVN来获取一些统计信息。为此,让项目在尽可能多的修订下成功编译将是有用的,即使它们是有缺陷的"由于缺少文件,例如本例中的修订版r102。对我来说,这是一个特殊的问题,因为项目的某些(几乎被遗弃)部分在很长一段时间内都缺少某些文件,而开发发生在项目的其他部分。原则上,通过使用以下方法可以解决问题(至少在我的情况下):

  • 从最新版本开始,然后svn up开始逐步修订。
  • 如果文件被svn up删除,则不要执行删除。

这样,我看到的版本实际上并不是代码的修订版本,因为它们在SVN中,但是后来修订版本中存在一些虚假文件。对于我想要使用的统计类型,这不是问题,因为只有主文件明确包含的文件才会被计算。有了这个,我将能够显着提高我的测量。

对我来说,这会带来

问题

如何指示SVN在svn up上跳过传入的文件删除?

1 个答案:

答案 0 :(得分:1)

最直接的方法似乎是进行干运行以找到要删除的文件,然后更新除这些文件之外的所有文件。

虽然svn up不支持干运行标志,但您可以使用svn merge执行干运行更新。处理修订号 - 这将合并r667。

svn merge --dry-run -r HEAD:666 .

您可以使用awk过滤掉要删除的文件:

awk '/^D/ {next} {print $2}'

最后,您可以使用xargs仅更新不会删除的文件:

xargs svn up -r667

将所有这些放在一起,合并修订版667:

svn merge --dry-run -r HEAD:666 . | awk '/^D/ {next} {print $2}' | xargs svn up -r667

在缺点方面,这是非常缓慢的,因为它基本上试图合并每个修订版两次。