[教程] Git 中修改提交中的用户信息

背景:

公司使用 gitlab 部署了本地 git 服务器,有自己的帐号体系,通过 GitHub desktop 同时管理 GitHub 仓库和 公司 gitlab 仓库的时候不小心往公司 gitlab 仓库提交了自己 GitHub 的帐号,这导致了 gitlab 交记录中的账号信息在 gitlab 服务器找不到,进而无法进行帐号信息的管理和统计。

那么,我怎么将错误提交到 commit 中的账号信息修改为 gitlab 服务器的账号体系中的帐号呢?

下面提供 3 种情景及其解决方案:
1. 如何修改 Git 中单个提交的提交者信息?
2. 如何批量修改所有 Git commit 提交者信息?
3. 如何将 Git 仓库中将指定用户的信息替换成另一个用户的信息?


一、git 如何修改单个 Commit 的提交者信息?

要修改 Git 中某个特定提交(commit)的提交者信息(作者姓名和邮箱),可以根据该提交的位置选择不同的方法。以下是详细的操作步骤:


✅ 修改最近一次提交的提交者信息

如果你需要修改的是最近的一次提交,可以使用以下命令:

git commit --amend --author="新作者名 <新邮箱地址>"

如果不想修改提交信息,可以添加 --no-edit 参数:

git commit --amend --author="新作者名 <新邮箱地址>" --no-edit

此命令会将当前分支的最新提交替换为一个新的提交,并更新作者信息。


🔄 修改历史中的某个提交的提交者信息

如果需要修改的是历史中的某个提交(非最近一次),可以使用交互式变基(interactive rebase):

  1. 首先,确定要修改的提交之前的那个提交的哈希值(commit ID)。可以使用 git log 查看提交历史:

    git log
    
    
  2. 启动交互式变基,将 <commit_id> 替换为上一步中找到的提交的哈希值:

    git rebase -i <commit_id>
    
    

    或者,如果你知道要回溯的提交数目,例如修改最近的第 3 个提交,可以使用:

    git rebase -i HEAD~3
    
    
  3. 在打开的编辑器中,找到要修改的那一行,将其前面的 pick 改为 edit,然后保存并退出。

  4. Git 会暂停在你选择的提交上。此时,使用以下命令修改提交者信息:

    git commit --amend --author="新作者名 <新邮箱地址>"
    
    

    如果不想修改提交信息,可以添加 --no-edit 参数。

  5. 继续变基操作:

    git rebase --continue
    
  6. 如果还有其他需要修改的提交,Git 会依次暂停,重复步骤 4 和 5,直到变基完成。


⚠️ 注意事项

  • 在使用 git rebase 修改历史提交时,请确保你对这些提交的历史有足够的了解,尤其是在这些提交已经推送到远程仓库的情况下。修改已推送的提交历史可能会导致其他协作者的代码库出现问题。

  • 如果你已经将修改后的提交推送到远程仓库,可能需要使用强制推送:

    git push --force
    
    

    请谨慎使用强制推送,确保不会影响其他协作者的工作。
    强制推送可能会受限制,请联系网络管理员解决,如果你有权限并且使用的是 gitlab 请跳转到本文结尾部分。


二、批量修改所有 Git commit 提交者信息的步骤:

  1. 设置用户信息:首先,你需要在本地仓库中设置用户信息。在命令行中输入以下命令:

    git config --local user.name '你的名字'
    git config --local user.email '你的邮箱'
    

    这将设置你的用户名和邮箱,这些信息将用于后续的 commit 信息。

  2. 开始 rebase:然后,你可以使用 git rebase -i --root --exec "git commit --amend --reset-author --no-edit" 来开始 rebase。这个命令会自动修改所有 commit 的提交者信息,并且不会打开编辑器来确认每个 commit(如果打开了,直接关掉即可)。

  3. 处理冲突:如果在执行 rebase 时遇到冲突,例如有一些未被跟踪的工作树文件会被覆盖,你可以选择以下几种方法之一来解决这个问题:

    • 提交或保存你当前的更改:在终端中运行 git stash 命令,它会将你的更改保存为临时存储,并将工作树重置为干净状态。然后你可以切换分支,并在需要的时候再应用这些更改。
    • 清除未跟踪的文件:你可以使用 git clean -d -f 命令来清除未跟踪的文件。这个命令会删除工作树中所有未被跟踪的文件和目录。然后你可以再次尝试执行 git rebase 命令。
  4. 同步到远端仓库:完成所有修改后,你需要将修改后的信息同步到远端仓库。你可以使用 git push -f 命令进行强制同步。但是,请注意,这个操作会覆盖远端分支的提交历史,所以在操作之前,请确认你了解这个操作的风险。

请注意,这个动作将会导致所有的提交信息中的用户名信息被修改!
强制推送可能会受限制,请联系网络管理员解决,如果你有权限并且使用的是 gitlab 请跳转到本文结尾部分。


三、如何在 Git 仓库中将指定用户的信息替换成另一个用户的信息?

这个过程需要使用 git filter-branch 命令。请按照以下步骤操作:

  1. 备份你的仓库
    在进行任何操作之前,建议先备份你的仓库,以防出现意外情况。

    git clone --mirror <repository_url> backup-repo.git
    
  2. 进入你的仓库目录

    cd <your-repo-directory>
    
  3. 使用 git filter-branch 替换用户信息
    假设你想将用户 old@example.com 替换为 new@example.com,并将用户名从 Old Name 替换为 New Name,可以使用以下命令:

    git filter-branch --env-filter '
    if [ "$GIT_COMMITTER_EMAIL" = "old@example.com" ]
    then
        GIT_COMMITTER_NAME="New Name"
        GIT_COMMITTER_EMAIL="new@example.com"
    fi
    if [ "$GIT_AUTHOR_EMAIL" = "old@example.com" ]
    then
        GIT_AUTHOR_NAME="New Name"
        GIT_AUTHOR_EMAIL="new@example.com"
    fi
    ' --tag-name-filter cat -- --branches --tags
    

友情提示: 指令中出现的 new/old@example.com 是假设的,请修改以符合实际情况!

出现下面的画面代表进入了处理程序,稍安勿躁静待佳音即可


出现下面的画面代表处理完成

  1. 强制推送更改到远程仓库
    由于历史记录被修改,需要强制推送更改到远程仓库。
    git push --force --tags origin 'refs/heads/*'
    

如果你看到这个画面,则代表修改完成!

  1. 清理旧的引用
    运行以下命令清理旧的引用:
    rm -rf .git/refs/original/
    git reflog expire --expire=now --all
    git gc --prune=now
    

至此,批量替换指定提交者信息操作结束!


关于强制推送受限的解决方案(仅供参考)

如果出现下面 报错,说明你的这个分支 不被允许强制推送

解决办法:使用浏览器开启这个仓库 ,按图示路径找到的复选框勾选上即可!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容