ฉันจะสร้าง Git ได้อย่างไรในอดีต?


222

ฉันกำลังแปลงทุกอย่างเป็น Git เพื่อการใช้งานส่วนตัวของฉันเองและฉันพบไฟล์รุ่นเก่าในที่เก็บอยู่แล้ว ฉันจะยอมรับประวัติโดยเรียงตามลำดับที่ถูกต้องตาม "วันที่แก้ไขไฟล์" ดังนั้นฉันจึงมีประวัติที่ถูกต้องของไฟล์?

ฉันบอกว่าบางอย่างเช่นนี้จะทำงาน:

git filter-branch --env-filter="GIT_AUTHOR_DATE=... --index-filter "git commit path/to/file --date " --tag-name-filter cat -- --all  

คำตอบสั้น ๆ และง่าย ๆ : stackoverflow.com/a/34639957/2708266
Yash

33
ฉันสงสัยว่าคนที่มองหาคำตอบนี้เพียงแค่ต้องการให้ GitHub "ผลงานแนว" ของพวกเขาอย่างต่อเนื่องวิธีนี้
ZitRo

1
@ZitRo ใช่ และการตั้งค่าgit commit --date="xxx day ago" -m "yyy"ก็เพียงพอแล้วสำหรับวัตถุประสงค์นั้นหากใครสงสัย
Vlas Sokolov

alexpeattie.com/blog/working-with-dates-in-git : หากกำลังมองหาคำอธิบายที่อ่อนโยน
thepurpleowl

คำตอบ:


198

คำแนะนำที่คุณได้รับมีข้อบกพร่อง การตั้งค่าโดยไม่มีเงื่อนไข GIT_AUTHOR_DATE ในการ--env-filterจะเขียนวันที่ของการกระทำทุกครั้ง นอกจากนี้ก็จะมีความผิดปกติในการใช้คอมไพล์กระทำ--index-filterภายใน

คุณกำลังเผชิญกับปัญหาอิสระมากมายที่นี่

การระบุวันที่นอกเหนือจาก“ ตอนนี้”

แต่ละการกระทำมีสองวันที่: วันที่ผู้เขียนและวันที่ผู้ส่ง คุณสามารถลบล้างแต่ละค่าได้ด้วยการจัดหาค่าผ่านตัวแปรสภาพแวดล้อม GIT_AUTHOR_DATE และ GIT_COMMITTER_DATE สำหรับคำสั่งใด ๆ ที่เขียนคอมมิทใหม่ ดู“ รูปแบบวันที่” ใน git-commit (1)หรือด้านล่าง:

Git internal format = <unix timestamp> <time zone offset>, e.g.  1112926393 +0200
RFC 2822            = e.g. Thu, 07 Apr 2005 22:13:13 +0200
ISO 8601            = e.g. 2005-04-07T22:13:13

คำสั่งเดียวที่เขียนคอมมิทใหม่ระหว่างการใช้งานปกติคือคอมมิทคอมมิท นอกจากนี้ยังมี--dateตัวเลือกที่ให้คุณระบุวันที่ของผู้แต่งได้โดยตรง การใช้งานที่คาดว่าจะของคุณรวมถึงgit filter-branch --env-filterยังใช้ตัวแปรสภาพแวดล้อมดังกล่าวข้างต้น (เหล่านี้เป็นส่วนหนึ่งของ“env” หลังจากที่ตัวเลือกในการตั้งชื่อดู“ตัวเลือก” ในคอมไพล์กรองสาขา (1)และพื้นฐาน“ประปา” คำสั่งคอมไพล์กระทำ -tree (1)

การแทรกไฟล์ลงในประวัติอ้างอิงเดียว

หากพื้นที่เก็บข้อมูลของคุณง่ายมาก (เช่นคุณมีเพียงสาขาเดียวไม่มีแท็ก) ดังนั้นคุณสามารถใช้การรีบูต gitเพื่อทำงาน

ในคำสั่งต่อไปนี้ใช้ชื่อวัตถุ (แฮช SHA-1) ของการคอมมิทแทนที่จะเป็น "A" อย่าลืมใช้วิธีการ“ ลบล้างวันที่” หนึ่งในวิธีที่คุณรันคอมมิทคอมมิท

---A---B---C---o---o---o   master

git checkout master
git checkout A~0
git add path/to/file
git commit --date='whenever'
git tag ,new-commit -m'delete me later'
git checkout -
git rebase --onto ,new-commit A
git tag -d ,new-commit

---A---N                      (was ",new-commit", but we delete the tag)
        \
         B'---C'---o---o---o   master

หากคุณต้องการที่จะอัปเดตที่จะรวมไฟล์ใหม่ (แทนการสร้างใหม่การกระทำที่มันถูกเพิ่ม) แล้วใช้แทนgit commit --amend git commitผลลัพธ์จะเป็นดังนี้:

---A'---B'---C'---o---o---o   master

งานด้านบนตราบใดที่คุณสามารถตั้งชื่อการส่งมอบที่ควรจะเป็นรายการหลักของการส่งมอบใหม่ของคุณ หากคุณต้องการให้ไฟล์ใหม่ของคุณเพิ่มผ่านรูทการคอมมิทใหม่ (ไม่มีพาเรนต์) แสดงว่าคุณต้องการไฟล์ที่ต่างออกไป

B---C---o---o---o   master

git checkout master
git checkout --orphan new-root
git rm -rf .
git add path/to/file
GIT_AUTHOR_DATE='whenever' git commit
git checkout -
git rebase --root --onto new-root
git branch -d new-root

N                       (was new-root, but we deleted it)
 \
  B'---C'---o---o---o   master

git checkout --orphanค่อนข้างใหม่ (Git 1.7.2) แต่มีวิธีอื่นในการทำสิ่งเดียวกันกับ Git รุ่นเก่า

การแทรกไฟล์ลงในแบบ Multi เตะประวัติศาสตร์

หากพื้นที่เก็บข้อมูลของคุณเป็นเรื่องที่ซับซ้อนมากขึ้น (คือมันมีมากกว่าหนึ่งโทษ (สาขา, แท็ก ฯลฯ )) แล้วคุณอาจจะต้องใช้คอมไพล์กรองสาขา ก่อนที่จะใช้สาขาตัวกรอง gitคุณควรทำสำเนาสำรองของพื้นที่เก็บข้อมูลทั้งหมดของคุณ ไฟล์เก็บถาวรtarแบบง่าย ๆของแผนผังการทำงานทั้งหมดของคุณ (รวมถึงไดเรกทอรี. git) ก็เพียงพอแล้ว สาขาตัวกรอง gitทำการอ้างอิงสำรอง แต่มักจะกู้คืนได้ง่ายขึ้นจากการกรองที่ไม่ถูกต้องโดยเพียงแค่ลบ.gitไดเรกทอรีของคุณและเรียกคืนจากการสำรองข้อมูลของคุณ

หมายเหตุ: ตัวอย่างด้านล่างใช้คำสั่งระดับล่างแทนgit update-index --add git addคุณสามารถใช้การเพิ่ม gitแต่ก่อนอื่นคุณต้องคัดลอกไฟล์จากตำแหน่งภายนอกไปยังเส้นทางที่คาดไว้ ( --index-filterเรียกใช้คำสั่งใน GIT_WORK_TREE ชั่วคราวที่ว่างเปล่า)

หากคุณต้องการให้ไฟล์ใหม่ของคุณถูกเพิ่มลงในการคอมมิทที่มีอยู่ทั้งหมดคุณสามารถทำได้:

new_file=$(git hash-object -w path/to/file)
git filter-branch \
  --index-filter \
    'git update-index --add --cacheinfo 100644 '"$new_file"' path/to/file' \
  --tag-name-filter cat \
  -- --all
git reset --hard

--env-filter 'GIT_AUTHOR_DATE=…'ผมไม่เห็นเหตุผลที่จะเปลี่ยนวันของการกระทำที่มีอยู่กับใด ๆ ถ้าคุณใช้มันคุณจะทำให้มันมีเงื่อนไขเพื่อที่มันจะได้เขียนวันที่สำหรับทุกการกระทำ

หากคุณต้องการให้ไฟล์ใหม่ของคุณปรากฏเฉพาะในคอมมิทหลังจากการคอมมิทที่มีอยู่ (“ A”) คุณสามารถทำได้ดังนี้:

file_path=path/to/file
before_commit=$(git rev-parse --verify A)
file_blob=$(git hash-object -w "$file_path")
git filter-branch \
  --index-filter '

    if x=$(git rev-list -1 "$GIT_COMMIT" --not '"$before_commit"') &&
       test -n "$x"; then
         git update-index --add --cacheinfo 100644 '"$file_blob $file_path"'
    fi

  ' \
  --tag-name-filter cat \
  -- --all
git reset --hard

หากคุณต้องการเพิ่มไฟล์ผ่านการคอมมิทใหม่ที่จะถูกแทรกลงในช่วงกลางของประวัติของคุณคุณจะต้องสร้างการคอมมิทใหม่ก่อนที่จะใช้git filter-branchและเพิ่ม--parent-filterไปยังgit filter-branch :

file_path=path/to/file
before_commit=$(git rev-parse --verify A)

git checkout master
git checkout "$before_commit"
git add "$file_path"
git commit --date='whenever'
new_commit=$(git rev-parse --verify HEAD)
file_blob=$(git rev-parse --verify HEAD:"$file_path")
git checkout -

git filter-branch \
  --parent-filter "sed -e s/$before_commit/$new_commit/g" \
  --index-filter '

    if x=$(git rev-list -1 "$GIT_COMMIT" --not '"$new_commit"') &&
       test -n "$x"; then
         git update-index --add --cacheinfo 100644 '"$file_blob $file_path"'
    fi

  ' \
  --tag-name-filter cat \
  -- --all
git reset --hard

นอกจากนี้คุณยังสามารถจัดสำหรับแฟ้มที่จะเพิ่มครั้งแรกในรากใหม่กระทำ: สร้างรากใหม่ของคุณกระทำผ่านทาง“เด็กกำพร้า” วิธีการจากคอมไพล์ rebaseส่วน (จับภาพในnew_commit) ให้ใช้อย่างไม่มีเงื่อนไข--index-filterและชอบ--parent-filter"sed -e \"s/^$/-p $new_commit/\""


ในตัวอย่างแรกของกรณีการใช้งาน "การแทรกไฟล์ลงในประวัติหลายอ้างอิง": มีวิธีที่จะ--index-filterนำไปใช้กับคอมมิทที่ส่งกลับโดยgit rev-list? ในขณะนี้ฉันเห็นตัวกรองดัชนีนำไปใช้กับชุดย่อยของรายการ rev ชื่นชมความเข้าใจใด ๆ
เม่น

@ Hedgehog: ตัวอย่าง "multi-ref" ทั้งหมดใช้-- --allเพื่อประมวลผลการกระทำทั้งหมดที่เข้าถึงได้จากการอ้างอิงใด ๆ ตัวอย่างสุดท้ายแสดงวิธีเปลี่ยนเฉพาะการกระทำบางอย่าง (เพียงทดสอบ GIT_COMMIT ตามที่คุณต้องการ) หากต้องการเปลี่ยนเฉพาะรายการที่ทำสัญญาคุณสามารถบันทึกรายการก่อนทำการกรอง (เช่นgit rev-list … >/tmp/commits_to_rewrite) จากนั้นทดสอบการเป็นสมาชิกภายในตัวกรอง (เช่นif grep -qF "$GIT_COMMIT" /tmp/commits_to_rewrite; then git update-index …) คุณพยายามทำอะไรให้สำเร็จ คุณอาจต้องการเริ่มต้นคำถามใหม่ถ้ามันมากเกินไปที่จะอธิบายในความคิดเห็น
Chris Johnsen

ในกรณีของฉันฉันมีโครงการขนาดเล็กที่ฉันตั้งใจจะอยู่ภายใต้การควบคุมของแหล่งที่มา (ฉันไม่ได้ทำเพราะเป็นโครงการเดี่ยวและฉันไม่ได้ตัดสินใจว่าจะใช้ระบบใด) "การควบคุมแหล่งที่มา" ของฉันเป็นเพียงเรื่องของการทำซ้ำแผนผังโครงการทั้งหมดของฉันไปยังไดเรกทอรีใหม่และเปลี่ยนชื่อไดเรกทอรีรุ่นก่อนหน้า ฉันยังใหม่กับ Git (ก่อนหน้านี้ใช้ SCCS, RCS และอนุพันธ์ RCS ที่เป็นกรรมสิทธิ์ที่น่าเกลียดซึ่งคล้ายกับ CVS) ดังนั้นไม่ต้องกังวลกับการพูดคุยกับฉัน ฉันได้รับความประทับใจว่าคำตอบนั้นเกี่ยวข้องกับส่วน "การแทรกไฟล์ลงในประวัติอ้างอิงเดียว" แก้ไข?
Steve

1
@Steve: สถานการณ์“ การอ้างอิงเดียว” จะนำไปใช้หากประวัติของคุณมาจากสายการพัฒนาเดียว (เช่นจะทำให้เข้าใจได้ว่าภาพรวมทั้งหมดถูกมองว่าเป็นจุดต่อเนื่องของสาขาเชิงเส้นเส้นเดียว) สถานการณ์จำลอง“ การอ้างอิงหลายจุด” จะมีผลบังคับใช้หากคุณมี (หรือมี) สาขาหลายแห่งในประวัติศาสตร์ของคุณ เว้นแต่ว่าประวัติของคุณจะมีความซับซ้อน (เวอร์ชั่น "แยก" สำหรับลูกค้าที่แตกต่างกันรักษาสาขา "แก้ไขข้อบกพร่อง" ในขณะที่งานใหม่เกิดขึ้นใน "การพัฒนา" ฯลฯ ) คุณอาจมองสถานการณ์ "อ้างอิงเดี่ยว" อย่างไรก็ตามดูเหมือนว่าสถานการณ์ของคุณจะแตกต่างจากคำถามนั้น ...
Chris Johnsen

1
@Steve: เนื่องจากคุณมีประวัติไดเรกทอรี - snapshots และคุณยังไม่มีที่เก็บ Git - ดังนั้นคุณสามารถใช้import-directories.perlGit's contrib/(หรือimport-tars.perlหรือimport-zips.py... ) เพื่อสร้างที่เก็บ Git ใหม่จาก snapshot ของคุณ การประทับเวลา“ เก่า”) กระบวนการrebase/ filter-branchเทคนิคในคำตอบของฉันจะต้องเฉพาะถ้าคุณต้องการแทรกไฟล์ที่ "ซ้าย" ของประวัติของพื้นที่เก็บข้อมูลที่มีอยู่
Chris Johnsen

119

คุณสามารถสร้างการกระทำได้ตามปกติ แต่เมื่อคุณส่งมอบให้ตั้งค่าตัวแปรสภาพแวดล้อมGIT_AUTHOR_DATEและGIT_COMMITTER_DATEเป็นชุดข้อมูลที่เหมาะสม

แน่นอนว่าสิ่งนี้จะทำให้การกระทำที่ส่วนท้ายของสาขาของคุณ (เช่นหน้า HEAD ปัจจุบันที่กระทำ) ถ้าคุณต้องการผลักมันกลับไปให้ไกลขึ้นใน repo คุณจะต้องได้รับแฟนซี สมมติว่าคุณมีประวัตินี้:

o--o--o--o--o

และคุณต้องการให้การกระทำใหม่ของคุณ (ทำเครื่องหมายเป็น "X") เพื่อให้ปรากฏที่สอง :

o--X--o--o--o--o

วิธีที่ง่ายที่สุดคือแยกสาขาจากการคอมมิชชันแรกเพิ่มการคอมมิชชันใหม่ของคุณจากนั้นรีบูตการคอมมิชชันอื่นทั้งหมด ชอบมาก

$ git checkout -b new_commit $desired_parent_of_new_commit
$ git add new_file
$ GIT_AUTHOR_DATE='your date' GIT_COMMITTER_DATE='your date' git commit -m 'new (old) files'
$ git checkout master
$ git rebase new_commit
$ git branch -d new_commit

25
ฉันมักจะพบคำตอบที่ดีนี้ แต่ต้องรีบออกไปหารูปแบบวันที่ดังนั้นที่นี่เป็นครั้งต่อไป 'วันศุกร์ที่ 26 กรกฎาคม 19:32:10 2013 -0400'
MeBigFatGuy

94
GIT_AUTHOR_DATE='Fri Jul 26 19:32:10 2013 -0400' GIT_COMMITTER_DATE='Fri Jul 26 19:32:10 2013 -0400' git commit
Xeoncross

15
ยังมีอีกมากมายตัวอย่างเช่น mnemonic 2013-07-26T19:32:10: kernel.org/pub/software/scm/git/docs/ …
Marian

3
โดยวิธีการที่ส่วน '-0400' พูดถึงเขตเวลาชดเชย โปรดระวังการเลือกอย่างถูกต้อง ... เพราะถ้าไม่เวลาของคุณจะเปลี่ยนไปตามนั้น ตัวอย่างเช่นในกรณีของตัวเองที่อาศัยอยู่ในชิคาโกฉันต้องเลือก '-0600' (อเมริกาเหนือ CST) คุณสามารถค้นหารหัสได้ที่นี่: timeanddate.com/time/zones
evaldeslacasa

2
ตั้งแต่วันที่ต้องทำซ้ำฉันพบว่าการสร้างตัวแปรอื่นง่ายขึ้น:THE_TIME='2019-03-30T8:20:00 -0500' GIT_AUTHOR_DATE=$THE_TIME GIT_COMMITTER_DATE=$THE_TIME git commit -m 'commit message here'
Frank Henard

118

ฉันรู้ว่าคำถามนี้ค่อนข้างเก่า แต่นั่นคือสิ่งที่ได้ผลจริงสำหรับฉัน:

git commit --date="10 day ago" -m "Your commit message" 

16
มันทำงานได้อย่างสมบูรณ์แบบ ฉันประหลาดใจที่--dateสนับสนุนรูปแบบวันที่แบบสัมพันธ์ที่มนุษย์อ่านได้
ZitRo

@ZitRo ทำไมไม่ 10 วัน?
Alex78191

10
คำเตือน: git --dateจะแก้ไข $ GIT_AUTHOR_DATE เท่านั้น ... ดังนั้นขึ้นอยู่กับสถานการณ์ที่คุณจะเห็นวันที่ปัจจุบันที่แนบมากับการกระทำ ($ GIT_COMMITTER_DATE)
Guido U. Draheim

3
ติดแท็กกับสิ่งที่ @ GuidoU.Draheim พูด git show <commit-hash> --format=fullerคุณสามารถตรวจสอบรายละเอียดการกระทำเต็มรูปแบบโดยใช้ ที่นั่นคุณจะเห็นAuthorDateวันที่ที่คุณระบุ แต่CommitDateเป็นวันที่ที่ส่งมอบจริง
d4nyll

ดังนั้นจึงไม่มีวิธีที่จะเปลี่ยน CommitDate หรือเพื่อให้การกระทำที่ผ่านมาอย่างสมบูรณ์? @ d4nyll
ราหุล

35

ในกรณีของฉันเมื่อเวลาผ่านไปฉันได้บันทึกเวอร์ชันของmyfileเป็น myfile_bak, myfile_old, myfile_2010, backups / myfile เป็นต้นฉันต้องการใส่ประวัติของ myfile ลงใน git โดยใช้วันที่แก้ไข ดังนั้นเปลี่ยนชื่อเก่าที่สุดเป็น myfile git add myfileจากนั้นgit commit --date=(modification date from ls -l) myfileเปลี่ยนชื่อเก่าที่สุดเป็น myfile อีกคอมไพล์กระทำด้วย - วันทำซ้ำ ...

เมื่อต้องการทำสิ่งนี้โดยอัตโนมัติคุณสามารถใช้ shell-foo เพื่อรับเวลาแก้ไขของไฟล์ ฉันเริ่มต้นด้วยls -lและcutแต่สถิติ (1) นั้นตรงกว่า

git กระทำ - วันที่ = "` สถิติ -c% y myfile `" myfile


1
ดี ฉันมีไฟล์จากก่อนวัน gitของฉันที่ฉันต้องการใช้เวลาแก้ไขไฟล์สำหรับ อย่างไรก็ตามสิ่งนี้ไม่เพียง แต่กำหนดวันที่ส่งมอบ (ไม่ใช่วันที่เขียน)
Xeoncross

จาก git-scm.com/docs/git-commit: --date"แทนที่วันที่ผู้แต่งที่ใช้ในการส่ง" git logดูเหมือนว่าวันที่จะเป็น AuthorDate git log --pretty=fullerแสดงทั้ง AuthorDate และ CommitDate
skierpage

16
git commitตัวเลือกที่--dateจะปรับเปลี่ยนไม่ได้GIT_AUTHOR_DATE GIT_COMMITTER_DATEดังที่หนังสือ Pro Gitอธิบายว่า: "ผู้แต่งคือคนที่เขียนงานมา แต่กำเนิดในขณะที่ผู้เดินทางคือคนสุดท้ายที่นำงานไปใช้" ในบริบทของวันที่GIT_AUTHOR_DATEเป็นวันที่ไฟล์ถูกเปลี่ยนในขณะที่GIT_COMMITTER_DATEเป็นวันที่มันได้รับการมุ่งมั่น สิ่งสำคัญคือที่นี่เพื่อทราบว่าโดยค่าเริ่มต้นgit logแสดงวันที่ผู้เขียนเป็น“ วันที่” แต่จากนั้นใช้วันที่ยอมรับสำหรับการกรองเมื่อได้รับ--sinceตัวเลือก
คริสโตเฟอร์

ไม่มีตัวเลือก -c สำหรับ stat ใน OS X 10.11.1
thinsoldier

เทียบเท่าสำหรับstat -c %yใน MacOS (และอื่น ๆ BSD พันธุ์) stat -f %mเป็น
ผู้ชนะ

21

ต่อไปนี้คือสิ่งที่ผมใช้ในการกระทำการเปลี่ยนแปลงในfooการN=1ในวันที่ผ่านมา:

git add foo
git commit -m "Update foo"
git commit --amend --date="$(date -v-1d)"

หากคุณต้องการที่จะกระทำไปเป็นวันที่แม้เก่าบอกว่า 3 วันกลับมาเพียงแค่เปลี่ยนอาร์กิวเมนต์:datedate -v-3d

มันมีประโยชน์จริง ๆ เมื่อคุณลืมที่จะทำอะไรเมื่อวานนี้

UPDATE : --dateยังยอมรับการแสดงออกเหมือนหรือแม้กระทั่ง--date "3 days ago" --date "yesterday"ดังนั้นเราสามารถลดคำสั่งเป็นหนึ่งบรรทัด:

git add foo ; git commit --date "yesterday" -m "Update"

6
คำเตือน: git --dateจะแก้ไข $ GIT_AUTHOR_DATE เท่านั้น ... ดังนั้นขึ้นอยู่กับสถานการณ์ที่คุณจะเห็นวันที่ปัจจุบันที่แนบมากับการกระทำ ($ GIT_COMMITTER_DATE)
Guido U. Draheim

การผสม 2 วิธีเข้าด้วยกันทำให้เข้ากันได้อย่างสมบูรณ์แบบ:git commit --amend --date="$(stat -c %y fileToCopyMTimeFrom)"
อังเดร

! น่ากลัว คำสั่งเดียวกันกับวันที่มนุษย์สามารถอ่านได้git commit --amend --date="$(date -R -d '2020-06-15 16:31')"
pixelbrackets

16

ในกรณีของฉันในขณะที่ใช้ตัวเลือก - วันที่กระบวนการ git ของฉันล้มเหลว ฉันอาจจะทำสิ่งที่น่ากลัว และเป็นผลให้ไฟล์ index.lock ปรากฏขึ้น ดังนั้นฉันจึงลบไฟล์ .lock ออกจากโฟลเดอร์. git และดำเนินการเองเพื่อให้ไฟล์ที่ถูกแก้ไขทั้งหมดถูกส่งในวันที่ผ่านไปและมันก็ใช้งานได้ในเวลานี้ ขอบคุณสำหรับคำตอบทั้งหมดที่นี่

git commit --date="`date --date='2 day ago'`" -am "update"

5
ดูความคิดเห็นดังกล่าวข้างต้น git commit --dateนอกจากนี้ข้อความคอมมิชชันของคุณควรได้รับการแก้ไขเพื่อไม่สนับสนุนข้อความบรรทัดเดียวที่ไม่ดีเช่น @JstRoRR เหล่านี้
Christopher

4
คำเตือน: git --dateจะแก้ไข $ GIT_AUTHOR_DATE เท่านั้น ... ดังนั้นขึ้นอยู่กับสถานการณ์ที่คุณจะเห็นวันที่ปัจจุบันที่แนบมากับการกระทำ ($ GIT_COMMITTER_DATE)
Guido U. Draheim

9

ในการทำคอมมิชชันที่ดูเหมือนว่าเคยทำมาแล้วคุณต้องตั้งค่าทั้งสองGIT_AUTHOR_DATEและGIT_COMMITTER_DATE:

GIT_AUTHOR_DATE=$(date -d'...') GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" git commit -m '...'

ที่date -d'...'สามารถเป็นวันที่แน่นอนเหมือนหรือญาติเช่น2019-01-01 12:00:005 months ago 24 days ago

หากต้องการดูทั้งสองวันในบันทึกการใช้คอมไพล์:

git log --pretty=fuller

วิธีนี้ใช้สำหรับการรวมการกระทำ:

GIT_AUTHOR_DATE=$(date -d'...') GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE" git merge <branchname> --no-ff

2

คุณสามารถเปลี่ยนวันที่ในคอมพิวเตอร์ทำการคอมมิทจากนั้นเปลี่ยนวันที่กลับมาและกด


1
ฉันคิดว่านั่นไม่ใช่วิธีการที่ถูกต้องมันอาจสร้างปัญหาที่ไม่ทราบบางอย่าง
Vino

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