เปลี่ยนการประทับเวลาขณะที่ rebasing git branch


100

ฉันได้จัดโครงสร้างคอมมิตใหม่ในสาขาก่อนที่จะเปิดเผยต่อสาธารณะทำให้การประทับเวลาของการคอมมิตเป็นแบบผสมกัน ฉันอยากจะให้พวกเขาทั้งหมดเป็นวันนี้โดยใช้เวลาเพียงไม่กี่วินาทีเท่านั้น

เห็นได้ชัดว่าการประทับเวลาเหล่านี้จะไม่ถูกต้องเช่นกัน แต่เนื่องจากเป็นเวลาที่สิ่งต่างๆออกสู่สาธารณะฉันจึงชอบสิ่งนั้นมากกว่าประวัติศาสตร์ที่ผสมผสานกันเวลาที่ชาญฉลาด

แล้วฉันจะบอกให้คอมไพล์สร้างการประทับเวลาใหม่ในขณะที่รีเบตได้อย่างไร


ด้วย Git 2.29 (ไตรมาสที่ 4 ปี 2020) a git rebase --rootหรือ-iด้วย--reset-author-dateจะใช้งานได้ ดูคำตอบของฉันด้านล่าง
VonC

คำตอบ:


136
git rebase --ignore-date

2
ฉันได้ลองทำก่อนโพสต์ .. ยกเว้นฉันไม่ได้ทำแบบโต้ตอบนั่นอาจเป็นเคล็ดลับ นอกจากนี้คุณได้ลองใช้นามแฝง --committer-date-is-author-date แล้วหรือยัง? บางที --ignore-date ถูกนำมาใช้ในรุ่นที่ใหม่กว่าฉันไม่รู้
Michael Krelin - แฮ็กเกอร์

2
ใช่ถ้าทำแบบไม่โต้ตอบมันได้ผล แต่แล้ว - เช่นเคยกับ rebase - การกระทำแรกสุดจะไม่ได้รับผลกระทบ
tarsius

2
@ MichaelKrelin-hacker: ตามเอกสาร--ignore-date แฟล็กเหล่านี้ถูกส่งผ่านไปยัง git am เพื่อเปลี่ยนวันที่ของการคอมมิทที่ถูก rebased ได้อย่างง่ายดาย เข้ากันไม่ได้กับตัวเลือก --interactive
ทิม

4
@Tim รูทคอมมิตไม่มีพาเรนต์และเมื่อฉันถามคำถามนี้ฉันก็ต้องการเปลี่ยนวันที่ของคอมมิตนั้นด้วย ตอนนี้เรามี--rootซึ่งทำให้เป็นไปได้
tarsius

3
Incompatible with the --interactive option. ดูเอกสาร
Vlastimil Ovčáčík

28

ในกรณีของฉันการเปลี่ยนเวลาใหม่เปลี่ยนการประทับเวลาเป็นค่า CommitDate ดังนั้นใน gitweb การคอมมิตที่มีอายุหลายเดือนจึงแสดงเป็น 4 วันใน gitweb ฉันพบการกระทำล่าสุดพร้อมวันที่ที่ถูกต้องและทำ:

$ git rebase --committer-date-is-author-date SHA

39
ไม่มันไม่ใช่. ในความเป็นจริงมันตรงกันข้ามแน่นอน จากเอกสารของgit rebase: " แฟล็กเหล่านี้ถูกส่งต่อไปgit amยังเพื่อเปลี่ยนวันที่ของการคอมมิทที่ถูก rebits " ในgit amนั้นระบุว่า: --committer-date-is-author-date" [... ] อนุญาตให้ผู้ใช้โกหกเกี่ยวกับวันที่ committer โดยใช้ค่าเดียวกับวันที่ผู้เขียน " while --ignore-date" [... ] อนุญาตให้ผู้ใช้โกหกเกี่ยวกับวันที่ผู้เขียนโดยใช้ค่าเดียวกัน เป็นวันที่ส่ง "
Enrico Campidoglio

13

มีวิธีดังต่อไปนี้

  1. rebase ปกติ

    git rebase --ignore-date
    
  2. rebase แบบโต้ตอบ

    git rebase -i master
    git commit --amend --date=now
    git push origin <branch> -f
    

2

จากความคิดเห็น:

เข้ากันไม่ได้กับไฟล์ --interactive option

อันที่จริง ... มันจะไม่เข้ากันกับ Git 2.29 (ไตรมาสที่ 4 ปี 2020): " git rebase -i" ( คน ) เรียนรู้ตัวเลือกมากขึ้นอีกนิด
ตัวเลือกที่เข้ากันได้กับ:

  • --interactive/-i
  • --root!

ดูกระทำ 6160b2e (26 สิงหาคม 2020) โดยJunio C Hamano (gitster )
ดูกระทำ 2712669 (17 สิงหาคม 2020) และกระทำ ef484ad (13 กรกฎาคม 2020) โดยRohit Ashiwal (r1walz )
ดูกระทำ a3894aa , กระทำ 7573cec , กระทำ e8cbe21 (17 สิงหาคม 2020) โดยฟิลลิปไม้ (phillipwood )
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ 9c31b19 , 03 ก.ย. 2020)

rebase -i: การสนับสนุน --ignore-date

Original-patch-by: Rohit Ashiwal
ลงนามโดย Phillip Wood

Rebase ถูกนำไปใช้กับแบ็กเอนด์สองแบบ - ' apply' และ ' merge' ซึ่งแต่ละแบ็กเอนด์สนับสนุนชุดตัวเลือกที่แตกต่างกัน

โดยเฉพาะอย่างยิ่งการใช้แบ็กเอนด์รองรับตัวเลือกจำนวนมากที่ดำเนินการโดย ' ( man ) ' ที่ไม่ได้ใช้งานในแบ็กเอนด์การผสาน ซึ่งหมายความว่าตัวเลือกที่มีจะแตกต่างกันไปขึ้นอยู่กับว่าใช้แบ็กเอนด์ใดซึ่งทำให้สับสนgit am

แพตช์นี้เพิ่มการรองรับ--ignore-dateตัวเลือกในการผสานแบ็กเอนด์

ตัวเลือกนี้ใช้เวลาปัจจุบันเป็นวันที่ของผู้เขียนแทนที่จะใช้วันที่ของผู้เขียนเดิมซ้ำเมื่อเขียนคอมมิตใหม่
เราดูแลจัดการการรวม--ignore-dateและ--committer-date-is-author-dateในลักษณะเดียวกับการใช้แบ็กเอนด์

และ:

rebase: เพิ่ม --reset-author-date

ช่วยเหลือโดย: Junio ​​C Hamano
ลงนามโดย: Rohit Ashiwal

การคอมมิตก่อนหน้านี้แนะนำ--ignore-dateแฟล็กไปrebase -iแต่ชื่อค่อนข้างคลุมเครือเนื่องจากไม่ได้บอกว่าวันที่เขียนหรือวันที่คอมมิทเตอร์ถูกละเว้น
เพิ่มนามแฝงเพื่อสื่อถึงวัตถุประสงค์ที่แน่นอน

--reset-author-date

นอกจากนี้:

rebase -i: support --committer-date-is-author-date

Original-patch-by: Rohit Ashiwal
ลงนามโดย Phillip Wood

แพตช์นี้เพิ่มการรองรับ--committer-date-is-author-dateตัวเลือกในการผสานแบ็กเอนด์
ตัวเลือกนี้ใช้วันที่สร้างของการกระทำที่ถูกเขียนใหม่เป็นวันที่คอมมิตเตอร์เมื่อสร้างคอมมิตใหม่

git rebaseตอนนี้รวมอยู่ในหน้าคน :

--committer-date-is-author-date:

แทนที่จะใช้เวลาปัจจุบันเป็นวันที่คอมมิทเตอร์ให้ใช้วันที่สร้างคอมมิตที่ถูก rebased เป็นวันที่คอมมิตเตอร์ ตัวเลือกนี้จะหมายถึง
--force-rebase

git rebaseยังรวมอยู่ในหน้าคน :

--ignore-date:

แฟล็กนี้ถูกส่งผ่านไปยัง 'git am' เพื่อเปลี่ยนวันที่สร้างของการคอมมิตที่ rebased แต่ละครั้ง (ดูgit am)


โปรดทราบว่าใน 2.29 (ด้านบน) คำสั่งย่อย" --committer-date-is-author-date" option ของ " rebase" และ " am" สูญเสียที่อยู่อีเมลโดยไม่ได้ตั้งใจซึ่งได้รับการแก้ไขด้วย Git 2.29.1 (Q4 2020)

ดูกระทำ 5f35edd , กระทำ 16b0bb9 , กระทำ 56706db (23 ตุลาคม 2020) โดยเจฟฟ์คิง (peff )
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ f34687d , 26 ต.ค. 2020)

am: แก้ไขอีเมลเสียด้วย --committer-date-is-author-date

ลงนามโดย: Jeff King

Commit e8cbe2118a ( am: หยุดการส่งออกGIT_COMMITTER_DATE,2020/08/17) เขียนรหัสสำหรับการตั้งค่าวัน committer เพื่อการใช้งานfmt_ident()มากกว่าการตั้งค่าตัวแปรสภาพแวดล้อมและให้commit_tree()จัดการกับมัน
แต่มีข้อบกพร่องสองประการ:

  • เราใช้สตริงอีเมลของผู้เขียนแทนอีเมลคอมมิตเตอร์
  • เมื่อแยกวิเคราะห์ committer Ident เราใช้ตัวแปรที่ไม่ถูกต้องในการคำนวณความยาวของอีเมลส่งผลให้มันเป็นสตริงที่มีความยาวเป็นศูนย์เสมอ

การกระทำนี้แก้ไขทั้งสองอย่างซึ่งทำให้การทดสอบตัวเลือกนี้ของเราผ่านapplyแบ็กเอนด์rebase " " ประสบความสำเร็จในขณะนี้

และ:

rebase: แก้ไขอีเมลที่เสียด้วย --committer-date-is-author-date

รายงานโดย: VenomVendor
Signed-off-off-by: Jeff King

Commit 7573cec52c ( "rebase -i สนับสนุน --committer-วันที่จะเขียนวัน" 2020/08/17, Git-v2.29.0 RC0 - ผสานการระบุไว้ในชุด # 13 ) คัดลอกโค้ด committer ident-แยก จากbuiltin/am.c.
และในการทำเช่นนั้นมันได้คัดลอกจุดบกพร่องที่เราตั้งค่าอีเมลเป็นสตริงว่างเสมอ

เราแก้ไขเวอร์ชันgit-amในการกระทำก่อนหน้านี้ การกระทำนี้แก้ไขรหัสที่คัดลอก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.