2017-02-15 67 views
1

我有時有一些相關的功能分支,與其他一些建築,如混帳:支路之間的依賴關係圖/表

   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 

所以我可以生成一個graphviz圖的依賴關係。

回答

0

這些實際上並不是依賴關係(雖然這可能對您的目的無關緊要)。

考慮這個簡短的變種,例如:

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

現在我們用git branch bar foo~1添加一個分支標籤bar

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

這似乎很奇怪地說,foo 「依賴」 barbar可以在任何時候眨眼進出。你需要的是 - 當你去建立你的圖表時,這會告訴你的想法 - 就是將這個視爲「foo10股份可到達承諾提交bar」。也就是說,您需要的是製作提交列表及其父ID,然後關聯各種ID。如果某個ID是,則從可以得到一個分支提示A,B和C,它們與這三個分支名稱共享其原因。

現在,你只需要生成兩個列表:

  • 每個分支尖端的哈希ID和
  • 每個哈希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後面)爲您提供commit-id,後跟該提交的所有父代(一個用於常規提交,兩個或更多用於合併提交,並且沒有父級用於提交超級用戶)的ID。 --not $exclude確保您沒有從$exclude中的名稱列表中獲得任何提交。

注意,多個分支名稱可能指向單個分支尖端提交,並且如果所有分支提示是「在或後面」的排除,的ID集第二列表可以是空的。