2017-05-17 83 views
0

我們有提交消息規則的雞與雞蛋情況。直到之後提交之後才能知道一條信息。我們認爲,不要求用戶修改提交(如果提交較舊,則需要重新綁定),如果用戶只需通過「註釋」機制添加信息就會很好。好的,到目前爲止,這麼好。在git預接收鉤子中訪問Notes

問題是,如果commit + notes信息不符合規則,我希望'pre-receive'鉤子能夠失敗推送。然而,我似乎無法弄清楚如何查看給定提交的註釋,除非筆記已經被提前提交。

我可以簡單地允許筆記推送通過未選中,然後檢查提交消息和它的筆記,當我看到提交。但是,這是一個不太理想的解決方法。我們可以保證訂單先做筆記,然後提交。但是,這是一個黑客。由於筆記中的信息,如果提交+筆記失敗,該怎麼辦?這意味着可以通過的說明需要修改。

相反,我想要同時獲得筆記和提交(類似git push origin refs/notes/* refs/heads/<branch>)。我們可以控制這個,因爲我們推送使用包裝腳本。如果兩個推動一起發生,我應該能夠通過/失敗整個事情。沒有錯誤的信息通過。

但我不能爲了我的生活弄清楚如何看筆記。理想的做法是在推送中的每個提交中使用類似git log --format=%N -1 <commit>的內容。但是這不會產生什麼,我猜是因爲提交和筆記都還沒有完成。我試過git notes list,希望能打印散列指向的對象(git cat-file -p <hash>)。但git notes list什麼都沒有產生。

想法?謝謝。

+0

也許您需要接受臨時分支機構,並且只有在所有信息都存在的情況下才可以回扣它們(有點像Gerrit中的提交門) – eckes

回答

1

預收到鉤得到所有參考更新(在標準輸入),那麼你可以通過他們都看過,看是否有refs/notes/更新,通過Notes讀取,然後將您的規則對基礎筆記對象。然而,這是非常痛苦的:因爲(你注意到)refs/notes/參考本身還沒有更新,所以git log找不到新的音符,所以你不得不深入到音符的實現中。

作爲一種替代方法,您也許可以手動更新掛鉤內部的註釋參考更新。不過這至少有點危險:在繼續之前,你需要「撤消」這個更新(使更新看起來像原子一樣)確保沒有別的東西使用註釋或Git存儲庫所有,在此期間。 (原因很複雜,並且依賴於Git版本:較新的Gits將傳入對象放置在單獨的備用對象存儲中,使它們可用於預接收和更新掛鉤,但通常不可用,因此傳入對象不需要丟棄,如果推被拒絕。)

我認爲eckes' suggestion (in a comment)也許是要走的路。爲了使其更加精細和自動化,您可以使用gitnamespaces,而不是禁止或允許推送到refs/heads/foo,以便所有推送都會以refs/proposed/refs/heads/foo爲例(並要求這是所述名稱的新創建)。然後,在接受推送後,運行檢查更新的後處理傳遞。如果它很好,請將其移至refs/heads/foo。如果沒有,請刪除refs/proposed/refs/heads/foo名稱,併發送推送電子郵件的任何人,並說他們的推送已自動回滾。這個想法有一個明顯的缺點:他們的Git會認爲推送已被接受,他們將不得不重新運行git fetch以使他們的refs/remotes/origin/foo重置爲未更新的值。此外,從技術上講,確切地知道是誰進行了推送,除非您使用唯一的用戶信息(您可以在接受refs/proposed/refs/heads/foo的同時錄製)通過ssh進行推送。

+0

感謝您的好信息。我們決定修改我們的工作流程,而不是解決這些複雜的問題。 – tanager