2017-02-15 2 views
1

я иногда несколько смежных отраслей полнометражных, с каким-то зданием на других, какGit: граф зависимостей межотраслевые/список

   o feature-B 
      /
      /
      o--o feature-A 
     /
     /
master o 
     \ 
     o feature-C 

Я хотел бы, чтобы отобразить график, показывающие, какие ветви зависят от которых, но с трудом получая git log --graph, чтобы получить то, что я хочу.

Следующие не отображаются отношения между ветвями.

$ git log --graph --format='%h%d' ^master feature-{A,B,C} 

* 801ecee208 (HEAD -> feature-B) 
* e568acd804 (feature-A) 
* f49ecc9e28 
* a42d73d4bc (feature-C) 

Изменение ^master к ^master~ улучшает вещи, но заставляет меня включить более раннее обязательство не волнует (origin/some-earlier-branch).

$ git log --graph --format='%h%d' ^master~ feature-{A,B,C} 

* 801ecee208 (HEAD -> feature-B) 
* e568acd804 (feature-A) 
* f49ecc9e28 
| * a42d73d4bc (feature-C) 
|/ 
* 67cf54dd0e (master) 
* 40b72ecc6a (origin/some-earlier-branch) 

Это очень близко к тому, что я хочу, хотя было бы неплохо пропустить эту последнюю строку.

То, что я действительно пытаюсь получить, - это своего рода манифестное перечисление, от ветвей которого зависят другие ветви. Что-то вроде

feature-A -> master 
feature-B -> feature-A 
feature-C -> master 

поэтому я могу сгенерировать граф зависимости графика.

ответ

0

На самом деле это не зависимостей (хотя это, вероятно, не имеет значения для вашей цели).

Рассмотрим этот краткий вариант, например:

o <-- foo 
/
    o 
/
o  <-- master 

Теперь мы используем git branch bar foo~1 добавить филиал этикетку bar:

o <-- foo 
/
    o  <-- bar 
/
o  <-- master 

Это кажется странным, что foo «зависит от» bar когда это bar может в любой момент подмигивать и исчезать. То, что вам нужно, - это будет информировать ваше мышление, когда вы идете построить свой график, - это рассматривать это как «fooдолей достижимых достижений сbar». То есть, вы захотите здесь составить список коммитов и их родительских идентификаторов, а затем сопоставить различные идентификаторы. Если какой-либо ID равен , то можно получить от подсказки ветви A, B и C, которые фиксируют свои причины для существующих с этими тремя именами ветвей.

Теперь вам нужно только создать два списка:

  • хэш-ID каждого наконечника ветви, и
  • хэш-идентификатор каждой фиксации достижимый от каждый кончик ветви, за исключением всех фиксаций достижима из любой имена, которые вы хотите исключить (например master)

, который это, например, должен делать (я не проверял):

for name in $names; do 
    echo $name $(git rev-parse $name) 
done 
echo -- 
git rev-list --parents $names --not $exclude 

Первого набор линий, до --, дает вам сопоставление имен-ID для филиала советов (если, конечно, что все имена в $names действительны). Второй набор строк, после --, для EOF, дает вам идентификаторы фиксации, за которыми следуют идентификаторы всех родителей этой фиксации (один для обычных коммитов, два или более для коммитов заемки, а также не для корней для корней). --not $exclude гарантирует, что вы не получите никаких достижений из списка имен в $exclude.

Обратите внимание, что несколько наименований ответвлений могут указывать на фиксацию одного кончика ветви, и если все подсказки ветви «за или за» исключают (-ы), второй список идентификационных наборов может быть пустым.

Смежные вопросы