2010-07-28 108 views
5

我有一個最初從Subversion導入的Git存儲庫。部分作者/提交者信息是錯誤的,這不是Git的錯,但主要是由於對Subversion的拙劣承諾。使用git filter-branch重寫作者/提交者並同時提交消息

我想用git filter-branch來重寫存儲庫的歷史記錄,修復提交者和作者信息。

問題是......我需要從提交消息中啜泣作者信息。據我所知,git filter-branch允許您篩選和更改作者信息(與--env-filter)和/或篩選提交消息(與--msg-filter),但而不是同時做兩個,在不同的過濾器之間共享信息。

所以我很難過如何做到這一點......我能想到的最好的辦法是多次傳遞:首先,收集所有提交消息,然後製作一個腳本以通過並過濾所有作者/提交者信息。這似乎相當不雅和容易出錯,所以我想知道是否有其他人已經找到了更順利的做這種工作。

回答

4

我能想到的唯一一件事情就是使用提交過濾器。就像消息過濾器一樣,它會在stdin上記錄日誌消息,這樣你就可以解析它並找出你需要的東西。然後您可以自己設置適當的變量,並自己撥打git commit-tree。 (該提交過濾器本質上是一個下拉更換爲犯樹,採取同樣的參數,併產生相同的輸出。)

在bash,它會是這樣的:

message=$(read_from_stdin) 

modify_env_vars "$message" 

echo "$message" | git commit-tree "[email protected]" 

我我從來沒有試過這個,但我不明白爲什麼它不起作用,假設你正確地編寫了這兩個shell函數! (只是一個小小的提示 - 並不是說​​--env-filter--msg-filter不能互相影響,而是它們總是按照這個順序運行,所以第一個過濾器會在文件中留下副作用或其他人看到的環境,但他們是在一個令你不想做你想做的事的順序)。

+0

謝謝,Jefromi,我會給這個鏡頭!另外,關於--env-filter和--msg-filter排序的好處:我曾經考慮過將臨時文件留在後面,但是意識到它不會按照我想要的順序工作。 – 2010-07-29 14:26:47