根据.mailmap文件重写git历史记录

jot*_*tik 1 git git-filter-branch

git是否提供了一种基于文件中指定的替换自动重写git存储库历史记录的方法.mailmap(git help shortlog有关详细信息,请参阅参考资料)?

cd repository.git
somecommand /path/to/.mailmap # <-- ???
Run Code Online (Sandbox Code Playgroud)

jot*_*tik 6

这没有简短的git命令.人们需要使用git filter-branch --commit-filter <command> [...]地方<command>改变了GIT_AUTHOR_NAME,GIT_AUTHOR_EMAIL,GIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL使用变量git check-mailmap-c mailmap.file=/path/to/.mailmap-c mailmap.blob=SOMEREV:path/to/.mailmap,例如使用.mailmap从主分支文件,可以使用

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 "$@"
' HEAD
Run Code Online (Sandbox Code Playgroud)

这肯定适用于具有POSIX shell的系统.

请注意,这不会重写Signed-off-by:提交消息中的任何或类似的行.