首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据.mailmap文件重写git历史记录

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

Stack Overflow用户
提问于 2014-12-03 15:13:30
回答 2查看 734关注 0票数 1

git是否提供了一种基于文件中指定的替换来自动重写git存储库历史记录的方法(请参阅获取详细信息)?

代码语言:javascript
复制
cd repository.git
somecommand /path/to/.mailmap # <-- ???
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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_NAMEGIT_AUTHOR_EMAILGIT_COMMITTER_NAMEGIT_COMMITTER_EMAIL变量,例如使用主分支中的.mailmap文件,可以使用

代码语言:javascript
复制
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:或类似行。

票数 6
EN

Stack Overflow用户

发布于 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过滤器版本如下所示:

代码语言:javascript
复制
# 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

可选的清理之后:

代码语言:javascript
复制
git rm .mailmap
git commit -m "delete mailmap after fixing history, no longer needed."
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27275187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档