我有很多(~200个)git存储库,其中一些包含未连接的(例如孤立的)分支。
我想清理那些未连接的分支(例如,如果可能的话将它们合并在一起),但需要找出实际受影响的存储库。
由于存储库的历史可能很长且令人费解,因此使用gitk
等图形工具检查每个存储库是不是的选项。
相反,我需要一种编程方式,找出哪些分支是分离的(例如来自HEAD
)。
答案 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>