我有许多来自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]开头的消息过滤提交..."?
答案 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。