更改之前提交的git email

fjaof16o  于 2023-01-28  发布在  Git
关注(0)|答案(3)|浏览(182)

所以我读了很多关于如何改变以前提交的电子邮件地址,但由于某种原因,我的是不更新.
我确实喜欢用我的本地电子邮件(nameofMyComputer@kevin.local)向我的私人回购提交40次,这很糟糕,因为这个电子邮件与Github没有关联(也不可能)。
然后我想起来我之前需要设置git.config,于是我就这么做了:

git config user.email "newemail@example.com"

然后做了一个测试提交,它运行得很完美。
有没有办法把我以前的所有提交都恢复到这封新邮件中?
我在SO How do I change the author and committer name/email for multiple commits?上读到这个问题并使用了这个

git filter-branch -f --env-filter "                         
                    GIT_AUTHOR_EMAIL='newemail@example.com'; 
                    GIT_COMMITTER_EMAIL='newemail@example.com';
                    " 
                HEAD

但是它不起作用...我仍然可以看到我以前提交的电子邮件,扩展名为.patch作为.local电子邮件地址

g6ll5ycj

g6ll5ycj1#

你确实可以像这样一次为许多提交执行他的操作:

git rebase -i HEAD~40 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"

我在this answer中做得更好。

qaxu7uf2

qaxu7uf22#

正如您在问题中提到的(您找到的答案的链接),这确实是脚本。

注:

filter-branch正在执行rebase(将***重写***分支的历史记录),这意味着拥有分支副本的每个人都必须删除并再次 checkout 它。
脚本来源于此处-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

脚本的作用是什么?

它会遍历你所有的提交,一旦你找到匹配项,它就会替换提交者的名字和电子邮件。

tkqqtvp1

tkqqtvp13#

这里有一个基于Chris Maes' 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="$1"

  # Based on
  # SO: https://stackoverflow.com/a/34863275/9238801

  local new_email="$(git config --get user.email)"
  local new_name="$(git config --get user.name)"

  # get each commit's email address ( https://stackoverflow.com/a/58635589/9238801 )
  # 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,所以这将导致一大堆其他的问题。

相关问题