git 修改已提交的某一次的邮箱和用户信息

git 公司用户名和自己的不同造成的

在提交代码的时候,默认使用了全局的git 用户配置,用户名 xiaoli 然后push 到github了

之后我配置了一下项目的git用户,使用了xiaowang又push了一次代码

如果我现在想改写第一次的git commit 的用户邮箱该怎么做那?

我使用

git rebase -i HEAD~2

但是只出现了最后一次的提交信息。

阅读 16.1k
评论
    4 个回答

    自问自答

    我现在是写了一个脚本,如果某个项目用错了 git 用户信息,我就把脚本放到项目里,运行一下脚本。

    脚本内容

    changeGitInfo.sh

    #!/bin/sh
    
    git filter-branch --env-filter '
    an="$GIT_AUTHOR_NAME"
    am="$GIT_AUTHOR_EMAIL"
    cn="$GIT_COMMITTER_NAME"
    cm="$GIT_COMMITTER_EMAIL"
    if [ "$GIT_COMMITTER_EMAIL" = "要修改的@邮箱地址.com" ]
    then
        cn="想要改成的用户名"
        cm="想要改成的邮箱"
    fi
    if [ "$GIT_AUTHOR_EMAIL" = "要修改的@邮箱地址.com" ]
    then
        an="想要改成的用户名"
        am="想要改成的邮箱"
    fi
        export GIT_AUTHOR_NAME="$an"
        export GIT_AUTHOR_EMAIL="$am"
        export GIT_COMMITTER_NAME="$cn"
        export GIT_COMMITTER_EMAIL="$cm"
    '

    使用方式

    sh ./changeGitInfo.sh
      • 26.8k

      我的操作步骤略麻烦,所以备图以做注解:

      首先,通过gitk打开历史纪录,如下图:

      图片描述

      本例中,我试图修改第三个提交more tests for later change cases对应的用户名/邮箱信息。

      第一步,拷贝第四个提交update readmeSHA1 ID值,如上图选中部分4535579(不必全部,印象中前八位足矣)

      第二步,回到命令行,开始执行rebase -i操作,如下:

      git rebase -i 4535579

      这个时候,git会自动调用配置好的编辑器打开一个界面,如下:

      图片描述

      第三步,修改第一行数据(就是我们预期要修改的那条commit)的pickedit,如下:

      图片描述

      保存退出,可以看到如下结果:

      图片描述

      帅,这时候我们就可以通过git commit --amend来畅快的修改用户信息了,操作如下:

      git commit --amend --author="LiLei <lilei@qq.com>" --no-edit

      继续完成rebase

      git rebase --continue

      再次打开gitk,就可以享受你的结果了:

      图片描述

      最后,通过git push --force将篡改历史纪录后的结果同步到服务器

      注意,强制更新会有一定风险,就是这个时候如果有其他人也在向服务器提交代码,那会被你的强制更新给覆盖掉。

        • 1.3k

        刚遇到这个问题,有个更好的办法 这个

        主要代码就是

        git filter-branch -f --env-filter \
        "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='newemail'; \
        GIT_COMMITTER_NAME='committed-name'; GIT_COMMITTER_EMAIL='committed-email';" HEAD

        HEAD可以替换成 HEAD~3...HEAD 这样就可以指定哪几次提交替换。

        相关问题: 这里

          • 22

          试试这个,加入判断, @雾秋 说的那样会将前N条提交记录全替换掉,不一定适合所有场景,当然所说的指定替换哪几次提交到是好挺好的。

          git filter-branch --force --env-filter '
            #如果Git用户名等于老的Git用户名 wangshuyin
            if [ "$GIT_COMMITTER_NAME" = "<Old Name>" || "$GIT_AUTHOR_EMAIL" = "<Old Email>" ];
            then
              #替换提交的用户名为新的用户名,替换提交的邮箱为正确的邮箱
              GIT_COMMITTER_NAME="<New name>";
              GIT_COMMITTER_EMAIL="<New email>";
              
              #替换用户名为新的用户名,替换邮箱为正确的邮箱
              GIT_AUTHOR_NAME="<New name>";
              GIT_AUTHOR_EMAIL="<New email>";
            fi
          ' --tag-name-filter cat -- --all
            撰写回答

            登录后参与交流、获取后续更新提醒

            相似问题
            推荐文章