Subversion: 如何获取所有活跃、未合并分支的列表?

7

我的问题类似于Mercurial:列出所有未合并的分支,但是针对的是SVN而不是Mercurial。

我需要找到一种方法来列出所有当前未合并到我的分支(通常是主干)中的分支。

据我所知,Git中的等效功能是git branch --no-mergedgit branch --merged

澄清一下,我不要求列出像许多其他StackOverflow问题过去所问的未合并修订版本的列表。

我将接受任何能够列出所有尚未合并的活动分支的解决方案。如果这不可能,则我将接受一个列出所有已经合并分支的答案,以便我可以倒退工作。

例如,如果我在repo/trunk上,并且repo有以下分支:

  • repo/branches/b1尚未合并到主干
  • repo/branches/b2已合并
  • repo/branches/b3在之前的修订中被删除并且没有合并
  • repo/branches/b4在合并后被删除

您的解决方案应返回b1或b2,但绝不能返回b3或b4。


你能定义在你的情况下什么使一个分支“活跃”吗?最近的提交?至少有一个提交自从它被分支出来? - Patrick Quirk
@PatrickQuirk 如果一个分支在HEAD版本中存在,那么它可以被视为活动分支。 - BoffinBrain
你尝试过创建一个脚本/批处理程序,列出 repo/branches/ 中的所有目录,然后使用 svn mergeinfo 检查每个目录是否需要合并吗? - royalTS
@royalTS 自定义脚本是我认为可能的,但它远远超出了我的能力范围。 - BoffinBrain
2个回答

4

首先,您需要列出HEAD版本中的所有分支:

svn list repo/branches/ -r HEAD

接着,你需要循环遍历结果并检查合并信息。以下是一个脚本,你可以保存为*.bat文件:

@echo off

for /f %%b in ('svn list repo/branches -r HEAD') do call :revisions %%b

exit /b

:revisions
for /f %%r in ('svn mergeinfo --show-revs eligible repo/branches/%1 repo/trunk') do (
    echo repo/branches/%1
    exit /b
)

我在这里使用了一个:revision子例程,因为我想在看到第一个可合并的修订版本时退出它。这就是为什么这个程序不会打印重复的分支。

您的命令确实会显示HEAD中的所有分支。这很容易做到。然而,这不是我需要的。我只想看到那些尚未合并到主干的分支的子集。 - BoffinBrain
我的错。我修复了我的解决方案。 - Peska
干得好!我已经在我们旧的SVN仓库上测试了这个,通过创建一个新分支(出现在列表中),然后将其合并到主干(导致它从列表中消失)。继续这样回答,你很快就会有足够的声望。 :) - BoffinBrain
FYI,我修改了批处理文件以添加 set repo=https://...,然后替换了整个文件中的 repo%repo%,使其可重复使用。你可能需要更新你的答案,以便让其他人更容易理解。 - BoffinBrain

1

对于使用MacOS或Linux的人,这里有一个基于Peska's answer的简单bash脚本。您可以在命令行中传递分支和主干文件夹的路径,否则它将默认为默认远程路径^/branches和^/trunk。

#!/bin/bash

BRANCHDIR=${1:-^/branches}
TRUNKDIR=${2:-^/trunk}

for branch in $(svn list "$BRANCHDIR" -r HEAD)
do
    for revision in $(svn mergeinfo --show-revs eligible "$BRANCHDIR/$branch" "$TRUNKDIR")
    do
        echo "$BRANCHDIR/$branch"
        break
    done
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接