如何查找master中所有未合并的提交按照创建的分支分组?

dre*_*ecs 17 git branch commit branching-and-merging

我必须从未合并的分支机构创建一些代码审查.

在寻找解决方案时,我们不要去本地分支上下文问题,因为这将在服务器上运行; 只有原点远程,我会在其他命令之前运行git fetch origin命令,当我们谈论分支时,我们将引用origin/branch-name.

如果设置很简单,并且每个源自master的分支继续以自己的方式继续,我们可以运行:

git rev-list origin/branch-name --not origin/master --no-merges
Run Code Online (Sandbox Code Playgroud)

对于每个未合并的分支,并将结果提交添加到每个分支的每个审阅.

当2-3个分支之间存在合并并且其中一些分支继续工作时会出现问题.正如我所说,对于每个分支,我想创建程序化的代码审查,我不想在多个评论中包含提交.

主要是每次提交找到原始分支时出现问题.
或者更简单一点......找到所有未创建的提交,这些提交按照他们最有可能创建的分支进行分组.

让我们关注一个简​​单的例子:

      *    b4 - branch2's head
   *  |    a4 - branch1's head
   |  *    b3
   *  |    merge branch2 into branch1
*  |\ |    m3 - master's head
|  * \|    a3
|  |  |
|  |  *    b2
|  *  |    merge master into branch1
* /|  |    m2
|/ |  *    merge branch1 into branch2
|  * /|    a2
|  |/ |
|  |  *    b1
|  | /
|  |/
| /|
|/ |
|  *       a1
* /        m1
|/
|
*          start
Run Code Online (Sandbox Code Playgroud)

而我想要获得的是:

  • branch1:a1,a2,a3,a4
  • branch2:b1,b2,b3,b4

我到目前为止找到的最佳解决方案是运行:

git show-branch --topo-order --topics origin/master origin/branch1 origin/branch2
Run Code Online (Sandbox Code Playgroud)

并解析结果:

* [master] m3
 ! [branch1] a4
  ! [branch2] b4
---
  + [branch2] b4
  + [branch2^] b3
 +  [branch1] a4
 ++ [branch2~2] b2
 -- [branch2~3] Merge branch 'branch1' into branch2
 ++ [branch2~4] b1
 +  [branch1~2] a3
 +  [branch1~4] a2
 ++ [branch1~5] a1
*++ [branch2~5] m1
Run Code Online (Sandbox Code Playgroud)

输出解释如下:

  1. n行是分析的n个分支
  2. 一行----
  3. 如果该提交位于第n个分支上,则第n个缩进字符的每个提交的一行加上(或者在合并提交的情况下为减号).
  4. 最后一行是所有分析分支的合并基础

对于第3点,提交名称解析以分支名称开头,从我看到,此分支对应于创建提交的分支,可能是通过促进第一父级到达的路径.

由于我对合并提交不感兴趣,我会忽略它们.

然后我将解析每个branch-path-commit以使用rev-parse获取它们的哈希值.

我该如何处理这种情况?

dre*_*ecs 15

可以使用克隆存储库--mirror创建一个裸存储库,该存储库可以用作原始存储库的镜像,并且可以更新,git remote update --prune之后应该删除此功能的所有标记.

我这样实现:
1.获取未合并为master的分支列表

git branch --no-merged master
Run Code Online (Sandbox Code Playgroud)

2.为每个分支获取该分支上的修订列表,而不是主分支中的修订列表

git rev-list branch1 --not master --no-merges
Run Code Online (Sandbox Code Playgroud)

如果列表为空,则从分支列表中删除分支
3.对于每个修订,确定原始分支

git name-rev --name-only revisionHash1
Run Code Online (Sandbox Code Playgroud)

并匹配正则表达式^([^\~\^]*)([\~\^].*)?$.第一个模式是分支名称,第二个模式是分支的相对路径.
如果找到的分支名称不等于初始分支,请从列表中删除修订.

最后,我获得了一个分支列表,并为每个分支提供了一系列提交.


经过一些更多的bash研究,它可以在一行中完成:

git rev-list --all --not master --no-merges | xargs -L1 git name-rev | grep -oE '[0-9a-f]{40}\s[^\~\^]*'
Run Code Online (Sandbox Code Playgroud)

结果是表单中的输出

hash branch
Run Code Online (Sandbox Code Playgroud)

可以读取,解析,排序,分组或其他.