ฉันได้ทำคอมมิชชันให้กับโปรเจ็กต์ใน Github แต่ฉันรู้ว่าฉันไม่ได้ตั้งค่าอีเมลที่ถูกต้องและชื่อเต็มของคอมมิทเตอร์บนคอมพิวเตอร์ที่ฉันใช้งานอยู่ในขณะนี้เพื่อสร้างคอมมิทของฉัน ไม่ได้อยู่ที่นั่น
ฉันจะเขียนอีเมลและชื่อผู้ใช้ที่ผ่านมาทั้งหมดได้อย่างไร
ฉันได้ทำคอมมิชชันให้กับโปรเจ็กต์ใน Github แต่ฉันรู้ว่าฉันไม่ได้ตั้งค่าอีเมลที่ถูกต้องและชื่อเต็มของคอมมิทเตอร์บนคอมพิวเตอร์ที่ฉันใช้งานอยู่ในขณะนี้เพื่อสร้างคอมมิทของฉัน ไม่ได้อยู่ที่นั่น
ฉันจะเขียนอีเมลและชื่อผู้ใช้ที่ผ่านมาทั้งหมดได้อย่างไร
คำตอบ:
คุณสามารถเพิ่มนามแฝงนี้:
git config alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter \"if [[ \\\"\$\`echo \$VAR\`\\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi\" \$@; }; f "
วิธีเปลี่ยนชื่อผู้แต่ง:
git change-commits GIT_AUTHOR_NAME "old name" "new name"
หรืออีเมลเฉพาะ 10 ข้อหลังล่าสุด:
git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD
Alias:
change-commits="!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$`echo $VAR`\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" \$@; }; f "
ที่มา: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig
git change-commits GIT_COMMITTER_EMAIL "old@example.com" "new@example.com"ถึงการเปลี่ยนอีเมลของผู้ส่ง
change-commits = "!f() { VAR1=$1; VAR='$'$1; OLD=$2; NEW=$3; echo \"Are you sure for replace $VAR $OLD => $NEW ?(Y/N)\";read OK;if [ \"$OK\" = 'Y' ] ; then shift 3; git filter-branch --env-filter \"if [ \\\"${VAR}\\\" = '$OLD' ]; then export $VAR1='$NEW';echo 'to $NEW'; fi\" $@; fi;}; f "
Cannot create a new backup. A previous backup already exists in refs/original/
วิธีแก้ปัญหามีอยู่แล้ว: เปลี่ยนชื่อผู้แต่งและผู้สื่อสารและอีเมลของคอมมิทหลายรายการใน Git
กล่าวคือ
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
หากคุณได้ผลักดันบางส่วนของการกระทำของคุณไปยังที่เก็บสาธารณะคุณไม่ต้องการที่จะทำเช่นนี้หรือมันจะทำให้รุ่นอื่นของประวัติต้นแบบที่คนอื่นอาจใช้ "อย่าข้ามลำธาร ... มันจะไม่ดี ... "
ที่กล่าวว่าหากเป็นเพียงข้อผูกพันที่คุณทำกับที่เก็บข้อมูลในพื้นที่ของคุณหมายความว่าแก้ไขก่อนที่จะส่งไปยังเซิร์ฟเวอร์ คุณสามารถใช้git filter-branchคำสั่งพร้อม--commit-filterตัวเลือกดังนั้นมันจะแก้ไขเฉพาะการกระทำที่ตรงกับข้อมูลที่ไม่ถูกต้องของคุณเช่นนี้
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "wrong_email@wrong_host.local" ];
then
GIT_AUTHOR_NAME="Your Name Here (In Lights)";
GIT_AUTHOR_EMAIL="correct_email@correct_host.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
git update-ref -d refs/original/refs/heads/masterดูที่ < stackoverflow.com/a/7654880/333403 >
A previous backup already exists in refs/original/ในกรณีนั้นให้เรียกใช้ใหม่พร้อมกับอีเมลใหม่และเพิ่มตัวเลือก-fก่อนหน้า - คอมมิชชันตัวกรอง ใช้ดุลยพินิจของคุณเอง มัก-fเป็นสิ่งอันตรายที่ต้องทำโดยไม่รู้ว่ากำลังทำอะไรอยู่
หลังจากใช้คำตอบของ Olivier Verdier:
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
... เพื่อพุชประวัติการเปลี่ยนแปลงบนที่เก็บต้นฉบับใช้:
git push origin +yourbranch
คำสั่งดังกล่าว (หมายเหตุบวก) กองกำลังเขียนประวัติบน repo เดิมเช่นกัน ใช้ด้วยความระมัดระวัง!
https://help.github.com/articles/changing-author-info/
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="oldEmail@xxx-MacBook-Pro.local"
CORRECT_NAME="yourName"
CORRECT_EMAIL="yourEmail"
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
ทั้งหมดนี้ใช้ได้สำหรับฉัน หลังจากกด git ตรวจสอบให้แน่ใจว่าได้เห็นการอัพเดตบนเว็บพอร์ทัลของ git หากการกระทำนั้นยังไม่ได้เชื่อมโยงกับบัญชีของฉันแสดงภาพขนาดย่อเริ่มต้นถัดจากการส่งและไม่ได้แสดงในแผนภูมิลำดับเวลาการมีส่วนร่วมของฉันไปที่ URL การกระทำและผนวก. แพทช์ที่ส่วนท้ายของ URL และยืนยันชื่อ และอีเมลถูกต้อง
สำหรับผู้ที่ต้องการรุ่นวางคัดลอกง่าย (นอกเหนือจากการปรับปรุงอีเมลและชื่อ):
git config alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter \"if [[ \\\"\$\`echo \$VAR\`\\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi\" \$@; }; f "
git change-commits GIT_AUTHOR_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_AUTHOR_EMAIL <old@email.com> <new@email.com> -f
git change-commits GIT_COMMITTER_NAME "<Old Name>" "<New Name>" -f
git change-commits GIT_COMMITTER_EMAIL <old@email.com> <new@email.com> -f
พิจารณาการใช้git-filter-branchจะไม่ได้ต้องการที่จะทำในสิ่งเดียวกันในGit-กรอง repo (คุณอาจต้องติดตั้งมันเป็นครั้งแรกที่มีpip install git-filter-repo):
git-filter-repo --name-callback 'return name.replace(b"OldName", b"NewName")' --email-callback 'return email.replace(b"old@email.com", b"new@email.com")'
หากที่เก็บเป็นต้นฉบับโดยไม่มีรีโมตคุณจะต้องเพิ่ม--forceเพื่อบังคับให้เขียนซ้ำ (คุณอาจต้องการสร้างข้อมูลสำรองของ repo ของคุณก่อนทำสิ่งนี้)
หากคุณไม่ต้องการที่จะรักษา refs (พวกเขาจะปรากฏในประวัติศาสตร์สาขาของ Git GUI) --replace-refs delete-no-addคุณจะต้องเพิ่ม
สำหรับคุณลักษณะขั้นสูงเพิ่มเติมโปรดดูที่"การกรองของชื่อและอีเมล"
PS ที่ถูกขโมยและการปรับปรุงจากhttps://stackoverflow.com/a/59591928/714907