git是否提供了一种基于文件中指定的替换来自动重写git存储库历史记录的方法(请参阅获取详细信息)?
cd repository.git
somecommand /path/to/.mailmap # <-- ???发布于 2014-12-03 22:11:57
这里没有简短的git命令。需要使用git filter-branch --commit-filter <command> [...],其中<command>使用git check-mailmap和-c mailmap.file=/path/to/.mailmap或-c mailmap.blob=SOMEREV:path/to/.mailmap更改GIT_AUTHOR_NAME、GIT_AUTHOR_EMAIL、GIT_COMMITTER_NAME和GIT_COMMITTER_EMAIL变量,例如使用主分支中的.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这当然应该适用于具有POSIX外壳的系统。
请注意,这不会重写提交消息中的任何Signed-off-by:或类似行。
发布于 2018-08-22 15:29:05
我今天需要这样做,但与另一个--commit-filter (根据How do I get a list of old->new rewritten commit SHAs from 'git filter-branch'?获取新旧提交ID的映射文件)相结合。
最后,我以@BooK的优秀的comment作为起点,所以让我们把它变成一个正确的答案。
git filter branch提供了在提交之前更改元信息的--env-filter选项,而--commit-filter在提交过程中会影响到它。这意味着我们可以将信息修复和实际提交分离为两个独立的筛选脚本。
“顺其自然”是env-filter需要export变量,所以它们坚持到提交阶段。
@jotik's answer的env过滤器版本如下所示:
# make sure we have a copy of the mailmap that won't be affected by other parts of the filter-branch
cp .mailmap /tmp/mailmap
git filter-branch \
--your-other-filters-here
--env-filter '
# fix author
# apply mailmap to "current" person tagline, store in temp $R
R=$(echo "$GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>" | git -c mailmap.file=/tmp/mailmap check-mailmap --stdin)
# extract mailmapped, pieces from $R using shell variable replacements
export GIT_AUTHOR_NAME="${R% <*@*>}"
R="${R##* <}"
export GIT_AUTHOR_EMAIL="${R%>}"
# repeat for committer
R=$(echo "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" | git -c mailmap.file=/tmp/mailmap check-mailmap --stdin)
export GIT_COMMITTER_NAME="${R% <*@*>}"
R="${R##* <}"
export GIT_COMMITTER_EMAIL="${R%>}"
' -- --all可选的清理之后:
git rm .mailmap
git commit -m "delete mailmap after fixing history, no longer needed."https://stackoverflow.com/questions/27275187
复制相似问题