簡體   English   中英

(如何)我可以過濾提交日志消息嗎?

[英](How) can I filter the commit log messages?

我使用git filter-branch... (根據我在書中找到的說明)反復從 git 存儲庫中提取了一個新模塊。 基本上我刪除了許多不相關的文件(即“其他所有文件”)。 現在我完成了,但是git log中有許多日志消息描述了對不再存在的文件的更改。

因此我有一個問題:是否可以“過濾掉”那些不影響任何剩余文件的日志消息? 此外,是否可以“修改”所有現有日志條目以刪除引用不再存在的文件的文本?

那就是第一部分將刪除完整的提交消息(也可能是“現在為空”的提交),而第二部分將允許編輯無法刪除的日志消息(可能類似於交互式rebase )。

這是很難做到的(雖然沒有收到更好的建議):

  1. git rebase --interactive <root-commit>開始(git 不允許使用全零的提交 ID)。 在編輯器中用reword替換每個pick 然后,做rebase,標記每個不相關的提交(即影響不再存在的文件)的標題,用一些獨特的標記,如DDD (表示“要刪除”)。 有超過 300 次提交,這是相當多的工作。

  2. 完成第一次變基后,執行第二次git rebase --interactive <root-commit> ,但這次刪除所有標記為DDD的行; 例如在vi中會使用 g/ DDD /d 此步驟有效地從歷史記錄中刪除不相關的提交消息。

  3. git log仍然顯示一些無用的提交消息時,您可能想要進行另一輪交互式 rebase,但這次使用squash而不是skip可能會合並多個提交的地方。 實際上,在我對結果感到滿意之前,我什至確實重復了這一步。

如果您在處理存儲庫之前分配了一個標簽,而在完成后又分配了一個標簽,您可以使用git diff <old-tag> <new-tag>檢查結果。 由於 rebase 廢棄了許多提交,您可能會考慮git gc (可能在git fsck之后)來整理工作空間。

Git 郵件列表中所述,基於 python 的git filter-repo使用--message-callback涵蓋了此用例。

例子

git-filter-repo --message-callback '
  if b"Signed-off-by:" not in message:
    message += b"\nSigned-off-by: Me My <self@and.eye>"
  return re.sub(b"[Ee]-?[Mm][Aa][Ii][Ll]", b"email", message)'

在你的情況下:

  • 編寫一個更復雜的 python function,以檢查提交消息是否包含文本文件中設置的文件列表中的文件名。
  • 添加一個--prune-empty=always ,以確保並刪除空提交。

暫無
暫無

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

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