เป็นบางครั้งที่เราจะลืมตั้งค่า Git author จนทำให้เราเผลอ push code ขึ้นไปโดยที่ author ผิด (ซึ่งเหตุการณ์นี้จะไม่เกิดขึ้นถ้าองค์กรตั้ง domain whitelist ไว้) ถ้าเราอยากจะแก้มันก็แค่ rebase เข้าไปเปลี่ยน author ดูง่าย แต่มันไม่ง่ายถ้าเรารู้ตัวอีกทีก็มี commit ที่ author ผิดขึ้นไปเป็นหลายสิบอันแล้ว เข้าไปแก้ก็ดูเสียเวลาเหลือเกิน ในบทความนี้เราจะนำ git-filter-repo ซึ่งได้รับการแนะนำโดยทีมพัฒนา Git เลย

$ git log

commit ...
Author: Correct Name <new@email.com>
Date:   ...

    existing-commit-1

commit ...
Author: Correct Name <new@email.com>
Date:   ...

    existing-commit-2

เริ่มจากการติดตั้งกันก่อน

  1. เราใช้ macOS ก็สามารถติดตั้งผ่าน Homebrew ได้เลย

     $ brew install git-filter-repo
    
  2. สร้าง file ขึ้นมาชื่อ mailmap (ไม่ต้องใส่ extension อะไรทั้งนั้น) จากนั้นให้เราใส่ข้อมูล email เก่าและใหม่ลงไปตาม format ดังนี้

     Correct Name <new@email.com> <old@email.com>
    
  3. จากนั้นเข้าไปที่ repository ของเราและให้ run คำสั่ง git filter-repo เพื่อทำการแก้ author ให้ถูกต้อง

     $ git filter-repo --mailmap <path/to/your/mailmap>
    
  4. ทีนี้เรา run คำสั่ง git log ขึ้นมาดูจะพบว่า author ของเราเปลี่ยนไปเป็นของใหม่แล้ว

     $ git log
    
     commit ...
     Author: Correct Name <new@email.com>
     Date:   ...
    
         existing-commit-1
    
     commit ...
     Author: Correct Name <new@email.com>
     Date:   ...
    
         existing-commit-2
    
  5. ตัว git-filter-repo จะทำการลบ remote address เดิมทิ้งเนื่องจากให้เราคิดอีกรอบว่าจะใช้ address เดิมไหมเพราะเวลาเรา push เข้า repository เดิมมันจะต้อง force เพราะเป็นการแก้ไข history ทำให้มีโอกาสที่จะไปกระทบกับคนอื่นที่ใช้ repository ด้วย ดังนั้นถ้าเราคิดจะใช้จริง ๆ ก็ให้เพิ่ม remote address ลงไป

     $ git remote add origin <your-remote-address.git>
    
  6. ทำการ push code ขึ้นถ้าเป็น repository เดิมก็ใส่ --force ลงไป

     git push -f origin <your-branch-name>
    

ก็เป็นวิธีที่แก้ไขปัญหาหลังจากที่มันเกิดไปแล้ว แต่ทางที่ดีกว่าคืออย่าลืมตั้งค่า Git ให้เสร็จก่อนเริ่มทำการพัฒนานะครับ (เขียนไว้เตือนตัวเองด้วย ฮ่า ๆๆ)

References

How to Change the Author of All Commits in a Git Repository