2014-12-03 23 views
0

是否混帳提供一種方式來自動改寫基於在.mailmap文件中指定的替代一個Git倉庫歷史的歷史(見git help shortlog瞭解詳細信息)?重寫提交歷史根據.mailmap文件

cd repository.git 
somecommand /path/to/.mailmap # <-- ??? 
+1

通過將您在此處引用的腳本編寫爲'somecommand'。我們無法猜測您期望它做什麼......我們中的一些人可能甚至不熟悉「.mailmap」文件是什麼,或者它可能包含什麼...... – twalberg 2014-12-03 17:00:46

+0

git'.mailmap'的格式文件記錄在'man 1 git-shortlog'中。改說我的問題。 – jotik 2014-12-03 21:33:47

回答

4

這裏沒有簡短的git命令。人們需要使用git filter-branch --commit-filter <command> [...]其中<command>改變使用git check-mailmap-c mailmap.file=/path/to/.mailmap-c mailmap.blob=SOMEREV:path/to/.mailmap,例如使用來自主分支.mailmap文件GIT_AUTHOR_NAMEGIT_AUTHOR_EMAILGIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL變量,可以使用

git filter-branch --commit-filter ' 
    R=`echo "$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>" | git -c mailmap.blob=master:.mailmap check-mailmap --stdin` 
    GIT_AUTHOR_NAME="${R% <*@*>}" 
    R="${R##* <}" 
    GIT_AUTHOR_EMAIL="${R%>}" 
    R=`echo "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" | git -c mailmap.blob=master:.mailmap check-mailmap --stdin` 
    GIT_COMMITTER_NAME="${R% <*@*>}" 
    R="${R##* <}" 
    GIT_COMMITTER_EMAIL="${R%>}" 
    git commit-tree "[email protected]" 
' HEAD 

這當然應該從事的帶有POSIX外殼的系統。

請注意,這不會在提交消息中重寫任何Signed-off-by:或類似的行。

+0

我很難做到這一點,因爲我沒有意識到'.mailmap'文件不在我的歷史中。添加它作爲最後一次提交也不起作用。查看git-config的文檔,我還會發現'mailmap.file',我可以指向倉庫之外的文件。 我用'--commit-filter'代替'--env-filter',並用環境變量所需的'export'命令替換了'git commit-tree'命令。 – BooK 2016-08-11 08:53:07

+0

請注意,如果您有註釋標籤,則「--tag-name-filter」的文檔將顯示:「也不支持更改作者或時間戳記(或有關該標籤的消息)。」我認爲這意味着你需要用'git tag'命令來重寫這些標籤。 – BooK 2016-08-11 09:04:52