代码之家  ›  专栏  ›  技术社区  ›  Dandikas

Subversion:如何查找未合并到主干的所有修订?

  •  55
  • Dandikas  · 技术社区  · 15 年前

    发布周期的分支源是常见的源管理场景之一。尽快合并是一种很好的做法。因此,我们有一个人为因素:分支是关闭的,但有人忘记了将某个东西合并回主干。

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

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

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

    欢迎使用脚本、工具和任何类型的SVN挂钩作为解决方案。

    附笔。

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

    11 回复  |  直到 7 年前
        1
  •  7
  •   Nathan Kidd    7 年前

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

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

    [更新]既然每个人都有支持的SVN版本,@tmont的答案就更好了。 svn mergeinfo --show-revs eligible svn merge --record-only 当您只想记录逻辑修复时。

        2
  •  68
  •   tmont    15 年前

    如果使用相对较新的Subversion版本(我认为是1.5或更高版本),您可以非常轻松地完成此操作。 mergeinfo 子命令。

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

    这将显示所有可以从分支“您的分支名称”合并到主干的修订。

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

        3
  •  2
  •   Mat Schaffer    15 年前

    我意识到您的情况可能太晚了,但对于这种情况,我要做的是为合并提交建立一个约定,以便稍后识别它们。例如“合并[1234]:…(1234的完整提交日志…)。然后我可以用脚本从SVN日志中解析它。

    为了确保整个团队都能做到这一点,请将合并约定制作成一个脚本,并将其放入项目中。(例如,/scripts/merge 1234)。人们通常会更欣赏这一点,因此如果脚本比原始的svn命令更容易进行合并,那么可以通过自动计算源URL之类的操作来实现。

    祝你好运。

        4
  •  1
  •   Ether    15 年前

    我不担心需要合并的具体变更编号,而是只关注差异:

    首先,使用主干更新侧分支(或查看将要合并的内容):

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

    在提交每个案例之前,不要忘记检查差异,以确保没有发生任何错误。您可能还需要解决一些冲突。

        5
  •  1
  •   onaclov2000    15 年前

    很抱歉,我现在没有在家里安装SVN服务器来测试这个,但是命令可以:

    svn log --verbose
    

    你可以分析它吗?我不确定合并回主服务器后的输出,但您可能能够通过(使用脚本,因为我是唯一一个使用SVN服务器的脚本)分析日志并读取所有已签入的文件,然后查找指示文件已合并到主服务器的关键字?

    如果我有时间的话,我今晚回家的时候会去看看。

        6
  •  0
  •   dma_k    15 年前

    因此,cvs为svn创建了一个标记来标记branch:)的根,它应该如下所示:

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

    笔记:

    1. 标签 项目1-b1-根 分支 项目1-B1 同时从主干创建。
    2. 没有人应该承诺 项目1-b1-根 (您可以将此操作限制为 标签/ 路径)。
    3. 当所有人都声称,他把所有东西都放在行李箱里时,你会在 项目1-b1-根 项目1-B1 并尝试将其应用于主干:已经应用的更改将被静默跳过,对于其余的更改,您将看到差异或冲突。
        7
  •  0
  •   Adam Liss    15 年前

    威尔 svn merge --dry-run 告诉你你需要的细节?

        8
  •  0
  •   amit kumar    15 年前

    由于缺少银弹,有纪律的方法是记录合并的内容以及从何处合并。

        9
  •  0
  •   Community CDub    7 年前

    基于 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 |'
    
        10
  •  0
  •   Ivan    12 年前

    三年后,我很喜欢你的作品。我相信对于你的任务,仍然没有解决的办法。

    但我在 $ svn help merge 建议不要进行子树合并:

    如果只合并子树,则子树路径必须为 包含在源和目标路径中;这是 气馁的 ,为了 避免子树合并信息

    所以我想解决方案是打破进行子树合并的“常见场景”。

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

        11
  •  0
  •   Meo    12 年前

    我使用WIKET和SvnKIT编写Java Web应用程序,以找到分支之间没有合并的修订,可以定制您想做的任何事情…… link

    o

    vnkit用于查找分支之间未合并的修订,它可以定制为执行您想要的任何操作… link

    screen o