git:列表分支*直接分支*关闭master

时间:2017-08-06 04:10:29

标签: git version-control

基本上,我想将git branch --no-merged origin/master的结果过滤到分支B,以便通过B的提交日志向后转移第一个分支我们遇到的是origin/master(或者,我们遇到的第一个分支是 origin/master)。

这可能是一种特定的用例,但感觉非常有用。我经常“管道”拉取请求:我会发送一个PR进行审核,但同时,开始处理第一个分支的新PR。因此,如果分支看起来像origin/master -> feature-a -> feature-b,我想知道我不应该为feature-b发送PR,因为feature-a应首先合并到origin/master。< / p>

我想要的大概是使用python:

import git

repo = git.Repo()
master = repo.commit('origin/master')
branch_heads = {repo.commit(b.name): b.name for b in repo.branches}

for branch in repo.branches:
  for commit in repo.iter_commits('origin/master..%s^' % branch.name):
    if commit in branch_heads:
      print branch.name, "branched from", branch_heads[commit]
      break

但更喜欢我可以将〜/ .gitconfig作为别名粘贴而不保存和分发该代码段。

编辑:

git for-each-ref --shell --format='git rev-list --simplify-by-decoration origin/master...%(refname)^ --format="%d"' refs/heads/ | sh

这非常接近。我想我只需要玩一些格式化选项,这就是我想要的。

1 个答案:

答案 0 :(得分:1)

这里的根本问题是分支 - 或更准确地说,分支名称 - 根本不相互关联。分支名称只是标识一个特定的提交。它的提交彼此相关。分支名称随着时间的推移而移动,而提交不是:提交是永久性的,不变的,而分支名称是短暂的,如mayflies

那就是说, 是你想要的一个公式:给定一些提交 C 1 ,C 2 , ...,C n 是分支 B 1 ,B 2 ,...的提示, B 1 ,你想依次开始每次提交 C i ,查看其历史记录,但不包括提交origin/master个点,并查看其他 C j,j≠i 是否指向任何提交。请参阅下文,了解指向的含义。

这里有几个明显的问题需要担心:

  • 可能是 B i B j 都指向即使 i≠j 也提交相同的提交

    ...--o--o   <-- origin/master
             \
              o--o   <-- br1, br2
    

    这里显而易见的事情就是抛弃除了其中一个分支名称之外的所有分支名称(任意选择一个,例如,只使用br1),以便所有 C i 是独一无二的。

  • 可能有些 C i 不是origin/master指向的提交的后代:

    ...--o--o   <-- origin/master
          \
           o   <-- br3
    

    这里显而易见的事情就是抛弃这样的分支名称,以便所有 C i 都是{{1>的后代}}

  • 分支机构可能相当&#34;浓密&#34;结果是这样的:

    origin/master

    对于这种特殊情况,没有明显的事情可做。但是,另一个变体可能具有更好的审核/拉取请求顺序:

    ...--o--o   <-- origin/master
             \
              \      o   <-- br4
               \    /
                o--o
                    \
                     o   <-- br5
    

    (以不同的方式绘制此图表会更为自然;我这样绘制它可以更容易地与之前的图表进行比较。)在这里,如果...--o--o <-- origin/master \ \ o <-- br4 \ / o--o \ o <-- br5 以其当前形式被接受,{ {1}}需要另外两个提交才能被批准在当前表单中被接受,并且在首先执行br5时只有两个提交需要审核。如果首先审核br4,则需要审核三个提交,之后只有一个要审核。

    不清楚这两个(如果有的话)是优选的,但至少有一些机会,计数不同的简单事实导致 a 偏好。

考虑到上述情况,让我们考虑早期的短语,看看是否有其他 C j,j≠i 指向任何一个那些提交。

如果我们不关心&#34;浓密的分支&#34;我们可以采用字面意思。如果最后两个图都不允许发生,那么其他一些分支提示字面上 br5中的一个提交,我们应该首先通过其他名称进行审核;或者 B i 是&#34;独立的&#34;用于审查目的。

如果&#34; bushiness&#34;可能会发生,由于上述情况,没有简单的规则涵盖所有内容。

有几种方法可以测试一些 B j 匹配上述br4生成的一个提交,但最简单,最直接的是字面意思查看git rev-list origin/master..Bi是否生成git rev-list生成的哈希ID之一。如果是这样,我们应该首先查看 B j 名称。事实上,我们应该找到最接近&#34;的 B j git rev-parse Bj提交,我们可以通过在每个 B j 上运行单独的git rev-list来完成。计数最低的那个&#34;胜出&#34;,所有其他的都被推迟了以后,就像 B i 一样。通过确保每个 B i 指向唯一的 C i ,我们确保此处没有任何联系过程

你的origin/master技巧也很有希望。它具有与上面概述的简单图形技术相同的约束(具有您无法检查的小缺陷,并确保仅使用git rev-list --count origin/master..Bj来满足约束条件。)