Subversion:如何find没有合并到中继的所有修订?

发布周期的分支源是常见的源pipe理场景之一。 尽快合并是一个好习惯。 因此,我们有一个人为因素:分支closures,但有人忘记合并东西回到主干。

问:是否有一个“一键”的方式来获取所有未从分支X合并到中继的修订号?

(注意:我不需要这些版本号来find合并的内容,我需要它们来创build自动validation,这会提醒人们确保他们不会忘记合并某些内容,而合并本身不是问题。

看起来像svn mergeinfo命令在这里没有帮助。 如果合并不是在根级上执行的,那么传递分支和树干根将会失败(这是常见的情况)。

脚本,工具任何types的svn钩作为解决scheme,是受欢迎的。

PS

SVN的最新版本。 没有必要争论这种情况有多普遍或者不错;)

简短的回答:我不这么认为。

很长的回答:我写了一个Python脚本来回答这个问题。 每当开发人员合并变更集时,他们都需要在日志消息中join“合并rXXX”。 (这个从svn:mergeinfo之前就存在了)这个脚本parsing所有活的svn分支+ trunk,recursion地扫描所有“合并”链接,输出一个没有合并的每个开发者列表。

[更新] @tmont的答案现在更好了,每个人都有一个svn版本,支持svn mergeinfo --show-revs eligiblesvn merge --record-only当你只想logging逻辑修复。

如果你用mergeinfo子命令使用相对较新版本的Subversion(1.5或更高版本,我认为),你可以很容易地做到这一点。

 svn mergeinfo --show-revs eligible svn://repo/branches/your-branch-name svn://repo/trunk 

这将显示所有有资格从分支“your-branch-name”合并到主干的修订。

资料来源: http : //svnbook.red-bean.com/en/1.5/svn.ref.svn.c.mergeinfo.html

我意识到你的情况可能为时已晚,但是我为这种事情做的是为合并提交build立一个约定,以便稍后可以识别。 例如“合并[1234]:…(完整提交日志1234)…”。 然后我可以用脚本parsing出svn日志。

为了确保整个团队都做到这一点,可以将合并约定转换为脚本并将其放入项目中。 (例如./scripts/merge 1234)。 人们通常甚至会欣赏这一点,加倍如果脚本合并比原始svn命令将更容易通过做自动计算源URL

祝你好运。

我不担心需要合并的具体更改数字,而只是看差异:

首先,将分支与树干进行更新(或查看将要合并的内容):

 cd branch-dir svn merge --reintegrate http://svnrepo/path-to-trunk . svn ci -m'making this branch current' cd ../trunk-dir svn merge --dry-run http://svnrepo/path-to-trunk http://svnrepo/path-to-branch . svn ci -m'merging in all unmerged changes from <branch>' 

记住,svn merge命令看起来就像svn diff命令 – 你创build一个diff / patch,然后把它应用到一个特定的位置。 上面的合并命令只是简单地说“把主干和分支之间的所有差异,并把它们应用到主干的工作副本”。 因此,您可以轻松地将第二个合并命令更改为您的邮件通知的差异。

不要忘记在每次提交之前检查差异,确保没有发生任何不良事件。 您可能还必须解决一些冲突。

对不起,我现在没有在家里使用我的SVN服务器来testing它,但是可以使用命令:

 svn log --verbose 

你可以parsing哪个? 我不确定在你合并回main之后的输出,但是你可能能够parsing(使用脚本,我没有,因为我是唯一一个使用我的SVN服务器)日志,并阅读所有已经签入的文件,然后查找一个关键字,指出该文件已被合并到main?

如果我有一些时间,我会在今晚的某个时候回家看看。

出于这个原因,CVS创build了一个标记来标记分支的根:)对于SVN应该看起来像:

 + trunk / project1 + tags / project1-b1-root + branches / project1-b1 

笔记:

  1. 标签project1-b1-root和分支project1-b1是从trunk中同时创build的。
  2. 没有人应该提交project1-b1-root (你可以限制这个操作的标签/path)。
  3. 当所有人声称,他已经把所有东西都放在树干上,你可以在project1-b1-rootproject1-b1之间做一个区别,试着将它应用到树干上:已经应用的变化将被默默地跳过,rest你会看到不同或碰撞。

svn merge --dry-run给你你需要的细节?

由于缺乏银弹,有条不紊的做法是logging合并的内容和地点。

根据以上的答复,从分支你想检查未修正的修订

 svn merge --dry-run http://svnrepo/path-to-merge-source . \ | grep Merging \ | sed 's/--- Merging//' \ | sed 's/into.*//' \ | sort -u \ | sed 's/ through r/:/' \ | sed -e :a -e N -e 's/\n//' -e ta \ | sed 's/ r/ -r/g' \ | sed 's|^|svn log http://svnrepo/path-to-merge-source |' 

我正在享受你的线程3年的创build。 而且我相信你的任务仍然没有解决的方式:)

我发现,虽然在$ svn help merge是build议不要做子树合并:

如果只想合并一个子树,则子树path必须包含在SOURCE和TARGET_WCPATH中; 这是不鼓励 ,以避免子树mergeinfo

所以我想解决scheme是打破你的“共同的情况下”做子树合并。

对合并操作build立一些控制是必须的,因为否则任何人对一个分支具有读访问权并且对另一个分支的写访问权可以从第一到第二合并。 所以真正的问题是 – 如何控制子树合并))

我已经编写了使用Wicket和SVNKit的Java Web应用程序用于查找分支之间没有合并修订,它可以被自定义做任何你想要的… 链接

屏幕 Ø