คำสั่งตัวกรองสาขาของ Git นั้นทรงพลัง แต่มันไม่ได้ใช้อย่างน่ากลัวสำหรับสิ่งที่ไม่สำคัญเช่นถ้าคุณมีผู้แต่งมากกว่าหนึ่งคนที่จะแก้ไข
นี่เป็นอีกทางเลือกหนึ่งที่ฉันพบว่ามีประโยชน์ซึ่งใช้คุณสมบัติ. mailmap ที่อธิบายไว้ใน git-shortlog manpage นี่เป็นกลไกการแมปผู้เขียนที่เราสามารถใช้กับสิ่งอำนวยความสะดวกในการจัดรูปแบบของบันทึก git เราสามารถใช้มันเพื่อสร้างคำสั่งเพื่อเลือกและแก้ไขการแก้ไขลำดับของคอมมิต
ตัวอย่างเช่นสมมติว่าคุณต้องการแก้ไขการเขียนในสาขา $ สาขาโดยเริ่มจากการยอมรับ $ START
คุณต้องสร้างไฟล์. mailmap ในไดเรกทอรีบนสุดของที่เก็บของคุณซึ่งจะจับคู่ชื่อผู้แต่งที่มีอยู่กับเขาให้ถูกต้อง คุณสามารถรับรายชื่อผู้แต่งที่มีอยู่ด้วย:
git shortlog -se
คุณต้องจบด้วยไฟล์. mailmap เช่นนี้ (พูด):
You <you@somewhere.org> cowens@localmachine
You <you@somewhere.org> root@localmachine
ตอนนี้คุณสามารถใช้คุณสมบัติการจัดรูปแบบของบันทึกการคอมไพล์เพื่อสร้างคำสั่งเพื่อเขียน $ BRANCH เป็น $ BRANCH2
git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh -
คำสั่งแรกสร้างสาขาใหม่ที่ว่างเปล่าแตกหน่อจากการกระทำ $ START สำหรับการคอมมิทแต่ละครั้งระหว่าง $ START ถึงตอนท้ายของ $ BRANCH คำสั่งที่สองเชอร์รี่จะเลือกคอมมิชชันดั้งเดิมจนถึงจุดสิ้นสุดของสาขาปัจจุบัน $ BRANCH2 และแก้ไขเพื่อตั้งค่าผู้เขียนให้ถูกต้อง
โดยทั่วไปยังสามารถใช้งานได้ - ใส่สิ่งนี้ใน ~ / .gitconfig ของคุณ:
[alias]
# git reauthor $START..$END
reauthor = !sh -c 'eval `git log --reverse --topo-order --pretty=format:\"git cherry-pick %H && git commit --amend -C %H --author=\\\"%aN <%aE>\\\" && \" $0 ` "echo success" '
ดังนั้นเมื่อคุณต้องการแก้ไขผู้เขียนตอนนี้คุณเพียงแค่ต้องสร้าง. mapfile และทำ:
git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH
การอ้างอิงสาขาเดิมสามารถกำหนดใหม่ให้กับสาขาใหม่และสาขาใหม่ที่ถูกลบ:
git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
git
เพื่อวัตถุประสงค์ที่คล้ายกันนี้จะถูกถามที่ดีขึ้นในกองมากเกิน