使用特定消息更改作者的提交

时间:2016-09-20 00:27:58

标签: git

我有许多来自maven插件的遗留提交,它使用真实用户凭据。 我知道如何通过电子邮件找到提交并更改作者(例如简短版本):

#!/bin/sh

git filter-branch --env-filter '
    OLD_EMAIL="your-old-email@example.com"
    CORRECT_EMAIL="your-correct-email@example.com"
    if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
    fi
' --tag-name-filter cat -- --all

如何通过以" [maven-plugin]开头的消息过滤提交..."?

1 个答案:

答案 0 :(得分:4)

首先,请注意git filter-branch的工作方式是复制提交。它从现有的,待过滤的提交中提取东西,运行您提供的每个过滤器,然后从结果中进行新的提交。如果新提交与旧提交完全匹配,则新提交的ID等于旧提交的ID,这意味着新提交 旧提交;否则新的提交会得到一个新的,不同的哈希。

当所有这一切都在进行时,filter-branch会记录一张地图:“旧哈希是X,新哈希是Y”。然后它会遍历要过滤的引用(分支和标记名称等),如果引用 R 用于指向 X filter-branch使 R 指向 Y

事实上,你可以改变任何东西。棘手的部分是决定哪些提交应该被更改,然后实际上只为那些提交更改正确的事情。在这种情况下,您希望修改消息以已知字符串开头的提交副本。

以这种方式调用标准--env-filter

eval "$filter_env" < /dev/null ||
    die "env filter failed: $filter_env"

这意味着它无法立即访问提交消息。但是,它确实具有提交的ID(在$GIT_COMMIT中),所以您需要做的就是读取提交消息并使环境变量以下条件更改:

if git log --no-walk --pretty=format:%b $GIT_COMMIT |
    grep '^\[maven-plugin] ' >/dev/null
then
    export GIT_AUTHOR_NAME="new author name" ... # set exports here
fi

使用git log --no-walk --format=<format>,您可以从之前的提交中提取您喜欢的任何内容。 (如果您的git log命令很旧,则需要--pretty=format:--pretty=tformat:拼写。)

有关export的内容,请参阅the git commit-tree documentation