[英]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...Y
是A...Q
第二個父級B
, D
和Y
提交者是 JosephineC
和E
提交者是 Lucian 我怎樣才能列出A...Q
中的提交,只合並 Lucian 的工作?
您無法使用單個git log
命令執行此操作。 關鍵問題是第 3 項:
A---Q
都是合並提交 因為這需要測試每個合並的第二個父級的提交者。 --committer=
--author=
和--committer=
測試測試提交本身,即,如果我們首先選擇了合並,我們將檢查合並本身的作者或提交者。
因此,解決方案是將git log
的面向腳本的兄弟git rev-list
與腳本結合使用。 毫無疑問,編寫腳本的方法有多種,但對我來說最明顯的是使用git rev-list
首先選擇所有可能有趣的合並提交。
我不清楚(因為這是git log
和git 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.