Есть ли способ получить количество дочерних узлов узла git commit? - PullRequest
1 голос
/ 18 апреля 2019

Я бы хотел найти n-й узел в графе фиксации, в котором он имеет 2 или более дочерних элементов.Так что, если история была:

A -- B -- C -- D
      \
       E -- F*

И я на F, я бы хотел найти B, если бы я искал 1-й узел с более чем одним дочерним узлом.

Как бы я это сделал?

1 Ответ

1 голос
/ 18 апреля 2019

Все внутренние связи Git указывают назад, от дочернего элемента к родительскому:

A <-B <-C <-D
     ↖︎            [this is an up-and-left arrow, but it may not work in some fonts]
      E <-F

Тем не менее, git rev-list имеет возможность переворачивать ссылки при ходьбе по графику.Таким образом, вы можете перемещаться по графику от F в обратном направлении, переворачивая каждую ссылку, чтобы составить список детей.Проблема в том, что только Git видит ссылки, по которым он переходит:

A-> B <-C <-D
     ↘︎            [this is a down-and-right arrow]
      E-> F

Это означает, что даже при использовании опции git rev-list, которая делает это (--children), Git будет требоватьчто у B есть один ребенок, а именно E.Чтобы заставить Git утверждать, что у B есть двое детей, E и C, вы должны начать с обоих F и D, чтобы git rev-list шел от Dв C в B:

A-> B-> C-> D
     ↘︎            [this is a down-and-right arrow]
      E-> F

Вы можете заставить Git запускаться со всех имен веток, используя --branches, или со всех имен тегов, используя --tags, или со всеми ссылками (включая такие, как refs/stash) с использованием --all.Добавьте --topo-order к команде git rev-list, и вы получите список коммитов и их потомков.Из этого списка вы захотите получить последний коммит, который приводит к F, но также имеет несколько дочерних элементов.К сожалению, вывод от git rev-list здесь все еще не очень полезен.Чтобы выполнить эту работу быстро, вы можете написать свой собственный считыватель графиков, в этом случае вы можете сделать свою собственную внутреннюю разметку и просто использовать git rev-list --parents --all или аналогичный.

(Эта работа намного проще в Mercurial, хотя даже там это может все еще быть нетривиальным.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...