_gen_ChangeIdInput() { echo "tree `git write-tree`" if parent=`git rev-parse "HEAD^0" 2>/dev/null` then echo "parent $parent" fi echo "author `git var GIT_AUTHOR_IDENT`" echo "committer `git var GIT_COMMITTER_IDENT`" echo printf '%s' "$clean_message" } _gen_ChangeId() { _gen_ChangeIdInput | git hash-object -t commit --stdin }
_gen_ChangeIdInput 函數輸出的信息包括:tree parent author committer 以及 log信息原文。把這些輸出到命令git hash-object -t commit --stdin 生成一個40位的哈希值,然后這個哈希值,經過awk這一串處理后,前面加上了 Change-ID: 最后就形成了 Change-Id: I7242a41d8c77df44d48aa97c9f1c9c502270bbd8 這樣子的change-id內容。
出現如題所示的報錯是因為歷史記錄里出現了兩個相同的Change-ID。
回想操作過程,之前提交的時候因為有merge,所以在gerrit服務器上審核的時候,我給abandoned了,因此從新處理提交的時候就出現了相同的tree, parent, author, committer以及log原文,這也就不難怪change-id也相同了。
添加一次可能導致Change-ID相同的情況,新的分支的提交是從另外的分支上cherry-pick過來的,所以當abandoned一次之后,再次cherry-pick時,Change-ID作為提交記錄一並cherry-pick過來了,所以會重復。方法是刪除Change-ID,然后重新git commit --amend重新生成新的Change-ID