簡體   English   中英

按第二個父級的提交者過濾 git log --merges

[英]filter git log --merges by commiter of the second parent

給出下面的 git 歷史示例:

  .-A---M---N---O---P---Q
 /     /   /   /   /   /
I     B   C   D   E   Y
 \   /   /   /   /   /
  `-------------'   X

並假設:

  • A...Q都是合並提交
  • A...Q是與第一父行A...Q
  • B...YA...Q第二個父級
  • B , DY提交者是 Josephine
  • CE提交者是 Lucian

我怎樣才能列出A...Q中的提交,只合並 Lucian 的工作?

您無法使用單個git log命令執行此操作。 關鍵問題是第 3 項:

  1. 事實:第一行A---Q都是合並提交
  2. 要求:僅選擇頂級提交...
  3. 要求:僅合並 Lucian 的作品(顯然是每個提交者姓名或提交者電子郵件,但我們可以輕松地測試作者;見下文)

因為這需要測試每個合並的第二個父級的提交者。 --committer= --author=--committer=測試測試提交本身,即,如果我們首先選擇了合並,我們將檢查合並本身的作者或提交者。

因此,解決方案是將git log的面向腳本的兄弟git rev-list與腳本結合使用。 毫無疑問,編寫腳本的方法有多種,但對我來說最明顯的是使用git rev-list首先選擇所有可能有趣的合並提交。

我不清楚(因為這是git loggit rev-list文檔中的圖表)您的意思是暗示只有這些提交,還是可能有更多的“內部”合並,例如,也許X不是單個提交,而是可能包含其自己的分支和合並的整個提交鏈。 如果你想要頂級提交,你可以使用--first-parent ,或者如果你有一個--ancestry-path例如--ancestry-path I..Q ,你可以使用它。 --merges添加到您想要獲得所有頂級合並或所有合並的任何限制:

git rev-list --merges Q |

git rev-list的輸出將包括所有合並提交,現在我們編寫剩余的管道,它測試每個合並並丟棄它,除非第二個父級的作者或提交者是我們想要的:

git rev-list --merges Q |
    while read rev; do
        p2=$(git rev-parse ${rev}^2)
        person=$(git log --no-walk --pretty=format:%cn $p2) # or %aN or %ce etc
        [ "$person" == "who we want" ] && echo $rev
    done

這個小腳本的輸出是要查看的提交集,因此我們只需將其通過管道傳輸到git log --stdin --no-walk即可獲得最終輸出:

git rev-list --merges Q |
    while read rev; do
        p2=$(git rev-parse ${rev}^2)
        person=$(git log --no-walk --pretty=format:%cn $p2)
        [ "$person" == "who we want" ] && echo $rev
    done |
    git log --stdin --no-walk # add formatting etc as desired

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM