更改 git 以前提交的电子邮件
Change git email for previous commits
所以我阅读了很多关于如何更改先前提交的电子邮件地址的内容,但由于某种原因我的没有更新。
我确实喜欢用我的本地电子邮件 (nameofMyComputer@kevin.local) 对我的私人仓库进行 40 次提交,这很糟糕,因为这封电子邮件与 github 没有关联(而且不可能) .
然后我想起来之前我需要设置 git.config 所以我做了:
git config user.email "newemail@example.com"
并进行了测试提交,效果很好。
有没有办法可以将我之前对这封新电子邮件的所有提交都还原?
我在 SO Change the author and committer name and e-mail of multiple commits in Git 上阅读了这个问题并使用了这个
git filter-branch -f --env-filter "
GIT_AUTHOR_EMAIL='kevin.cohen26@gmail.com';
GIT_COMMITTER_EMAIL='kevin.cohen26@gmail.com';
"
HEAD
但它没有用...我仍然可以看到我以前提交的电子邮件,扩展名为 .patch 作为 .local 电子邮件地址
正如您在问题中提到的(您找到的答案的 link),这确实是脚本。
注:
filter-branch
正在做一个 rebase (将 rewrite 的历史分支),这意味着拥有分支副本的每个人都必须删除并重新签出它。
脚本来源来自这里 - Git-Tools-Rewriting-History:
# Loop over all the commits and use the --commit-filter
# to change only the email addresses
git filter-branch --commit-filter '
# check to see if the committer (email is the desired one)
if [ "$GIT_COMMITTER_EMAIL" = "<Old Email>" ];
then
# Set the new desired name
GIT_COMMITTER_NAME="<New Name>";
GIT_AUTHOR_NAME="<New Name>";
# Set the new desired email
GIT_COMMITTER_EMAIL="<New Email>";
GIT_AUTHOR_EMAIL="<New Email>";
# (re) commit with the updated information
git commit-tree "$@";
else
# No need to update so commit as is
git commit-tree "$@";
fi'
HEAD
脚本的作用是什么?
它会遍历你所有的提交,一旦你找到匹配,它就会替换提交者的姓名和电子邮件。
您确实可以像这样一次完成许多提交:
git rebase -i HEAD~40 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"
我在 this answer 中更好地解决了这个问题。
这是一个基于 的版本,它仅将更改应用于具有匹配电子邮件地址的提交,并使用 rebase --root
(自 git 1.7 起)从你的历史。
如果您想选择特定的基础提交,您需要删除 --root
,并使用您想要的 refspec。
function reauthor_all {
if [[ "$#" -eq 0 ]]; then
echo "Incorrect usage, no email given, usage is: $FUNCNAME <email>" 1>&2
return 1
fi
local old_email=""
# Based on
# SO:
local new_email="$(git config --get user.email)"
local new_name="$(git config --get user.name)"
# get each commit's email address ( )
# I've broken this up into two statements and concatenated
# because I want to delay evaluation
local command='[[ "$(git log -1 --pretty=format:'%ae')" =='
command+=" '$old_email' ]] && git commit --amend --author '$new_name <$new_email>' --no-edit || true"
git rebase -i --root -x "$command"
}
在我自己的仓库中使用:
reauthor_all "personal.email@gmail.com"
hint: Waiting for your editor to close the file...
Press ENTER or type command to continue
Executing: [[ "$(git log -1 --pretty=format:%ae)" == 'personal.email@gmail.com' ]] && git commit --amend --author 'Matthew Strasiotto <39424834+matthewstrasiotto@users.noreply.github.com>' --no-edit || true
Executing: [[ "$(git log -1 --pretty=format:%ae)" == 'personal.email@gmail.com' ]] && git commit --amend --author 'Matthew Strasiotto <39424834+matthewstrasiotto@users.noreply.github.com>' --no-edit || true
[detached HEAD 1e281b5] First Message
...etc
当最终看起来正确时,你需要强制推送,这将改变提交 shas,因此这将导致一大堆其他问题。
所以我阅读了很多关于如何更改先前提交的电子邮件地址的内容,但由于某种原因我的没有更新。
我确实喜欢用我的本地电子邮件 (nameofMyComputer@kevin.local) 对我的私人仓库进行 40 次提交,这很糟糕,因为这封电子邮件与 github 没有关联(而且不可能) .
然后我想起来之前我需要设置 git.config 所以我做了:
git config user.email "newemail@example.com"
并进行了测试提交,效果很好。
有没有办法可以将我之前对这封新电子邮件的所有提交都还原?
我在 SO Change the author and committer name and e-mail of multiple commits in Git 上阅读了这个问题并使用了这个
git filter-branch -f --env-filter "
GIT_AUTHOR_EMAIL='kevin.cohen26@gmail.com';
GIT_COMMITTER_EMAIL='kevin.cohen26@gmail.com';
"
HEAD
但它没有用...我仍然可以看到我以前提交的电子邮件,扩展名为 .patch 作为 .local 电子邮件地址
正如您在问题中提到的(您找到的答案的 link),这确实是脚本。
注:
filter-branch
正在做一个 rebase (将 rewrite 的历史分支),这意味着拥有分支副本的每个人都必须删除并重新签出它。
脚本来源来自这里 - Git-Tools-Rewriting-History:
# Loop over all the commits and use the --commit-filter
# to change only the email addresses
git filter-branch --commit-filter '
# check to see if the committer (email is the desired one)
if [ "$GIT_COMMITTER_EMAIL" = "<Old Email>" ];
then
# Set the new desired name
GIT_COMMITTER_NAME="<New Name>";
GIT_AUTHOR_NAME="<New Name>";
# Set the new desired email
GIT_COMMITTER_EMAIL="<New Email>";
GIT_AUTHOR_EMAIL="<New Email>";
# (re) commit with the updated information
git commit-tree "$@";
else
# No need to update so commit as is
git commit-tree "$@";
fi'
HEAD
脚本的作用是什么?
它会遍历你所有的提交,一旦你找到匹配,它就会替换提交者的姓名和电子邮件。
您确实可以像这样一次完成许多提交:
git rebase -i HEAD~40 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"
我在 this answer 中更好地解决了这个问题。
这是一个基于 rebase --root
(自 git 1.7 起)从你的历史。
如果您想选择特定的基础提交,您需要删除 --root
,并使用您想要的 refspec。
function reauthor_all {
if [[ "$#" -eq 0 ]]; then
echo "Incorrect usage, no email given, usage is: $FUNCNAME <email>" 1>&2
return 1
fi
local old_email=""
# Based on
# SO:
local new_email="$(git config --get user.email)"
local new_name="$(git config --get user.name)"
# get each commit's email address ( )
# I've broken this up into two statements and concatenated
# because I want to delay evaluation
local command='[[ "$(git log -1 --pretty=format:'%ae')" =='
command+=" '$old_email' ]] && git commit --amend --author '$new_name <$new_email>' --no-edit || true"
git rebase -i --root -x "$command"
}
在我自己的仓库中使用:
reauthor_all "personal.email@gmail.com"
hint: Waiting for your editor to close the file...
Press ENTER or type command to continue
Executing: [[ "$(git log -1 --pretty=format:%ae)" == 'personal.email@gmail.com' ]] && git commit --amend --author 'Matthew Strasiotto <39424834+matthewstrasiotto@users.noreply.github.com>' --no-edit || true
Executing: [[ "$(git log -1 --pretty=format:%ae)" == 'personal.email@gmail.com' ]] && git commit --amend --author 'Matthew Strasiotto <39424834+matthewstrasiotto@users.noreply.github.com>' --no-edit || true
[detached HEAD 1e281b5] First Message
...etc
当最终看起来正确时,你需要强制推送,这将改变提交 shas,因此这将导致一大堆其他问题。