以编程方式检查未连接的分支

时间:2015-10-12 21:16:12

标签: git

我有很多(~200个)git存储库,其中一些包含未连接的(例如孤立的)分支。

我想清理那些未连接的分支(例如,如果可能的话将它们合并在一起),但需要找出实际受影响的存储库。

由于存储库的历史可能很长且令人费解,因此使用gitk等图形工具检查每个存储库是不是的选项。

相反,我需要一种编程方式,找出哪些分支是分离的(例如来自HEAD)。

1 个答案:

答案 0 :(得分:1)

您使用git以一种特定方式定义的单词(例如" orphan"以及"分离的"),其方式与git的使用方式不同。我我知道你的意思,但为了清楚起见,这里有一个包含三个分支和两个root提交的repo的简要图表:

A <- B <- C   <-- branch1

         F    <-- branch2
       /
D <- E
       \
         G    <-- branch3

这三个分支中的哪个(如果有的话)是孤立的&#34;?也许branch1是一个孤儿,其中branch2和branch3是&#34; non-orphaned&#34 ;;但也许branch1是唯一的&#34;非孤儿&#34;而branch2和branch3是&#34;孤儿&#34;。

无论如何,无论如何,你选择定义它,你的任务是找到你想要声明的根源&#34;孤立&#34;,可能通过查找所有root提交:

git rev-list --all --max-parents=0

然后决定哪些是&#34; orphan-y&#34; vs&#34; non-orphan-y&#34;。然后,对于每个分支,查看它们包含哪些根。请注意,一个分支可能包含多个根。例如,在上面的示例中,如果您确定root A是&#34; orphan-y&#34;,您可以通过合并来自branch2的提交来解决此问题,例如:

A <- B <- C - M   <-- branch1
            /
         F    <-- branch2
       /
D <- E
       \
         G    <-- branch3

现在,branch1包含两个根,因此是&#34;非孤儿-y&#34;。

(当然,如果这不是你的意思,使用单词&#34; orphan&#34;和&#34; detached&#34;,这个答案可能不是很有用。)

(为了以编程方式执行此操作,您仍然需要定义分支具有&#34;孤立&#34; root与具有&#34;非孤儿&#34; root的那个的含义,但是在此之后,只需在每个分支上使用git branch --contains--contains的新git for-each-ref选项。请参阅this question及其答案。)< / p>