修改git全部已提交的使用者名稱和郵箱

峻峰飛陽發表於2019-01-02

即:修改git所有commit中的使用者名稱和email

作為一名 Git 苦手,我一直使用的是傻瓜級的 Github 客戶端,去年九月遷移到 OS X 後也是如此。好幾個月後我發現自己的 contribution graph 有一大片空白,才意識到遷移之後 commit 的作者資訊都錯誤了…

Before

Before

沒計入 contribution 簡直不能忍啊!身為打卡強迫症覺得這幾個月相當於白乾了啊!

檢視 git log 發現提交者的郵箱是 Uni@Uni-MacBook-Pro.local,明白了原因是沒有配置正確的郵箱。

配置方法:

git config --global user.email "youremail@google.com"
git config --global user.name "your name"

但是補救措施只對以後的 commit 起效。如果想修改之前的作者資訊,Github 給出了可靠的官方指南:Changing author info。我打算照做的時候卻發現第三步要複製貼上的指令碼怎麼也找不到…後來意識到是 Gist 被牆了 = = 魂淡!

掛上 SS 終於看到了完整指令碼…把我翻譯後的完整步驟貼到下面來。

改變作者資訊

為改變已經存在的 commit 的使用者名稱和/或郵箱地址,你必須重寫你 Git repo 的整個歷史。

警告:這種行為對你的 repo 的歷史具有破壞性。如果你的 repo 是與他人協同工作的,重寫已釋出的歷史是一種不好的習慣。僅限緊急情況執行該操作。

使用指令碼改變你 repo 的 Git 歷史

我們寫了一段能把 commit 作者舊的郵箱地址修改為正確使用者名稱和郵箱的指令碼。

注意:執行這段指令碼會重寫 repo 所有協作者的歷史。完成以下操作後,任何 fork 或 clone 的人必須獲取重寫後的歷史並把所有本地修改 rebase 入重寫後的歷史中。

在執行這段指令碼前,你需要準備的資訊:

  • 欲修改的舊的郵箱地址

  • 正確的使用者名稱和郵箱地址

1.開啟終端(Mac 或 Linux 使用者)或命令列(Windows 使用者)。

2.建立一個你的 repo 的全新裸 clone (repo.git 替換為你的專案,下同)
git clone --bare https://github.com/user/repo.git
cd repo.git

3.複製貼上指令碼,並根據你的資訊修改以下變數:
OLD_EMAIL
CORRECT_NAME
CORRECT_EMAIL

指令碼:

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

4.按 Enter 執行指令碼。

5.檢視新 Git 歷史有沒有錯誤。

6.把正確歷史 push 到 Github:(push 有困難時記得修改 DNS 或者搭梯子)
git push --force --tags origin 'refs/heads/*'

7.清除臨時 clone。
cd ..
rm -rf repo.git

All done!現在遺失的 contribution 都回來啦~新的一年記得在 Github 上勤打卡~

注:當執行完上述的命令後,發現新clone出來的歷史記錄中name和email資訊已經為最新的資訊;可是在執行上面的腳步之前已經clone出來的專案,如果執行git pull的話,歷史記錄中的name和email資訊還是原來的資訊

相關文章