Subversion:如何找到未合并到trunk的所有修订版?

时间:2010-02-05 14:17:58

标签: svn merge branch

发布周期的分支来源是常见的源管理方案之一。尽快合并是一种很好的做法。因此,我们有一个人为因素:分支已关闭,但有人忘记将某些内容合并回主干。

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

(注意:我不需要这些修订号来找到要合并的内容,我需要它们来创建自动验证,这会提醒人们确保他们不会忘记将某些内容合并到主干。合并本身不是问题。)

似乎svn mergeinfo命令在这里无法提供帮助。如果不在根级别执行合并,则传递分支和主干根将失败(这是常见的情况)。

脚本,工具可以使用任何类型的svn钩子作为解决方案。

P.S。

最新版本的SVN。无需争论这种情况有多普遍或好;)

11 个答案:

答案 0 :(得分:69)

如果您使用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

答案 1 :(得分:7)

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

答案很长:我最后编写了一个python脚本来回答这个问题。 每当开发人员合并变更集时,他们都需要在日志消息中放入“合并的rXXX”。 (这来自svn:mergeinfo之前)脚本解析所有实时svn分支+ trunk并递归扫描所有“合并”链接,输出他们尚未合并的每个开发人员更改列表。

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

答案 2 :(得分:2)

我意识到你的情况可能为时已晚,但我为此类做的事情是为合并提交建立一个约定,以便以后可以识别它们。例如“合并[1234]:...(完整提交日志1234)......”。然后我可以稍后用脚本从svn日志中解析它。

要确保整个团队都能完成,请将合并约定制作成一个脚本并将其放入项目中。 (例如./scripts/merge 1234)。人们通常会更加欣赏这一点,如果脚本使得合并比原始svn命令更容易,就像通过自动计算源URL一样

祝你好运。

答案 3 :(得分:1)

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

首先,使用行李箱使侧支路更新(或查看要合并的内容):

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命令 - 你创建了一个diff / patch,然后将它应用到特定的位置。上面的合并命令只是说“获取主干和分支之间的所有差异,并将它们应用于主干的工作副本”。因此,您可以轻松地将第二个合并命令更改为用于邮件通知的差异。

在每种情况下,不要忘记检查差异,以确保没有发生任何不良事件。您可能还必须解决一些冲突。

答案 4 :(得分:1)

对不起,我现在没有自己的SVN服务器在家测试,但可以命令:

svn log --verbose

您可以解析哪个?合并回main后我不确定输出,但你可能能够解析(使用脚本,我没有,因为我是唯一使用我的SVN服务器的人)日志并阅读全部已签入的文件,然后查找表明该文件已合并到main的关键字?

如果我有时间的话,今晚回家的时候我会试着检查一下。

答案 5 :(得分:0)

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

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

注意:

  1. 标记 project1-b1-root 和分支 project1-b1 是从trunk创建的。
  2. 没有人应该提交 project1-b1-root (您可以为标记/ 路径限制此操作。)
  3. 当每个人声称,他已将所有内容放到主干中时,您在 project1-b1-root project1-b1 之间进行区别并尝试将其应用于trunk:已经应用的更改将被静默跳过,其余的您将看到差异或冲突。

答案 6 :(得分:0)

svn merge --dry-run会为您提供所需的详细信息吗?

答案 7 :(得分:0)

由于没有银弹​​,纪律严明的方法是记录合并的内容和地点。

答案 8 :(得分:0)

根据Ether的回复above,从您要检查未合并修订的分支

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 |'

答案 9 :(得分:0)

在创建3年后,我很享受你的主题。而且我相信你的任务形式仍然没有解决方案:)

我在$ svn help merge中找到的建议是不要进行子树合并:

  

如果只想合并一个子树,那么子树路径必须是   包含在SOURCE和TARGET_WCPATH中;这是气馁,到   避免子树mergeinfo

所以我猜解决方案是打破你做“子树合并”的“常见场景”。

必须为合并操作建立一些控制,否则任何对一个分支具有读访问权限和对另一个分支具有写访问权限的人都可以从第一个到第二个进行合并。所以实际的问题是 - 如何控制子树合并))

答案 10 :(得分:0)

我使用Wicket和SVNKit编写了Java Web应用程序,用于查找分支之间没有合并的修订,可以自定义以执行任何操作... link

screenØ