เราจะเปลี่ยนการประทับเวลาของการคอมมิชชันเก่าใน Git ได้อย่างไร?


747

คำตอบของวิธีการแก้ไขคอมมิชชันที่ยังไม่ได้ดำเนินการ อธิบายวิธีแก้ไขข้อความคอมมิชชันก่อนหน้าซึ่งยังไม่ได้รับการอัปสตรีม ข้อความใหม่สืบทอดการประทับเวลาของการส่งต้นฉบับ ดูเหมือนว่ามีเหตุผล แต่มีวิธีตั้งเวลาอีกครั้งหรือไม่



34
git commit --amend --reset-author
Erick M. Sprengel

คำตอบ:


535

ใช้git filter-branchกับตัวกรอง env ที่ตั้งค่าGIT_AUTHOR_DATEและGIT_COMMITTER_DATEสำหรับแฮชการคอมมิตเฉพาะที่คุณต้องการแก้ไข

นี่จะทำให้โมฆะนั้นและแฮชทั้งหมดในอนาคต

ตัวอย่าง:

หากคุณต้องการเปลี่ยนวันที่ส่งมอบ119f9ecf58069b265ab22f1f97d2b648faf932e0คุณสามารถทำสิ่งนี้ได้:

git filter-branch --env-filter \
    'if [ $GIT_COMMIT = 119f9ecf58069b265ab22f1f97d2b648faf932e0 ]
     then
         export GIT_AUTHOR_DATE="Fri Jan 2 21:38:53 2009 -0800"
         export GIT_COMMITTER_DATE="Sat May 19 01:01:01 2007 -0700"
     fi'

4
ดู "DATE FORMATS
Dustin

8
ที่พบค่าที่ถูกต้อง แต่เพียงการตั้งค่าตัวแปรเหล่านั้นดูเหมือนจะไม่ส่งผลกระทบต่อวันที่กระทำเก่า
IQAndreas

36
คุณหมายถึงอะไร "สิ่งนี้จะทำให้โมฆะนั้นและแฮชทั้งหมดในอนาคต"
EpicDavi

16
EpicDavi: หมายความว่าคุณจะต้องบังคับให้กดไปยังที่เก็บข้อมูลระยะไกลและใครก็ตามที่ดึงการกระทำหรือการกระทำในอนาคตจะต้องรีเซ็ตและดึงหรือลบและโคลนจากศูนย์ เท่าที่ฉันรู้ไม่มีวิธีใดที่จะแก้ไขปัญหานี้ได้
EriF89

4
เช่นเดียวกับโน้ตสำหรับผู้เริ่มต้นแฮชสั้นไม่ทำงานในคำสั่ง if ให้ใช้ SHA-1 ที่ยาว
40detectives

780

คุณสามารถทำการรีบูตแบบโต้ตอบและเลือกการแก้ไขสำหรับการมอบหมายที่มีวันที่คุณต้องการแก้ไข เมื่อกระบวนการรีบูตหยุดเพื่อแก้ไขการคอมมิตที่คุณพิมพ์เช่น:

git commit --amend --date="Wed Feb 16 14:00 2011 +0100"

หลังจากนั้นคุณดำเนินการลดการโต้ตอบของคุณ

UPDATE (เพื่อตอบสนองต่อความคิดเห็นของ studgeek): เพื่อเปลี่ยนวันที่ส่งมอบแทนที่จะเป็นวันที่ของผู้แต่ง:

GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amend

บรรทัดด้านบนตั้งค่าตัวแปรสภาพแวดล้อม GIT_COMMITTER_DATE ซึ่งใช้ในการแก้ไขการส่งมอบ

ทุกอย่างทดสอบใน Git Bash


22
@nschum - วันที่ = "" และ - ข้อมูล "ไม่ใช่ข้อความวันที่" ให้ผลเหมือนกันโดยใช้วันที่ในตอนนี้
Paul Pladijs

12
ในรุ่น git 1.7.7.1 ใช้ - วันที่ = "ตอนนี้" ให้ร้ายแรง: รูปแบบวันที่ไม่ถูกต้อง: ตอนนี้
Aragorn

4
เมื่อการกระทำที่มีวันที่คุณต้องการเปลี่ยนเป็นการกระทำล่าสุดคุณไม่จำเป็นต้องทำrebaseคุณสามารถทำได้git commit --amend
Eponymous

7
แทนที่จะส่งออก GIT_COMMITTER_DATE = "" ให้ลองยกเลิกการตั้งค่า GIT_COMMITTER_DATE
Mark E. Haase

2
ฉันใช้ - ไม่แก้ไขเพื่อให้คุณสามารถใช้ในสคริปต์อัตโนมัติ! + var fixedDate = strftime(new Date(), "%c"); + var result = shelljs.exec("git commit --amend --date=\"" + fixedDate + "\" --no-edit");
Marcello de Sales

392

วิธีที่ดีกว่าในการจัดการคำแนะนำเหล่านี้ทั้งหมดในหนึ่งคำสั่งคือ

LC_ALL=C GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"

การดำเนินการนี้จะกำหนดวันที่ส่งมอบคอมมิตและผู้เขียนเป็น "ตอนนี้เลย"


22
วิธีนี้ใช้ได้ผลดีในการแก้ไขการคอมมิทเฉพาะระหว่างการรีบูตแบบโต้ตอบ
friederbluemle

2
คุณสามารถเพิ่มนามแฝงลงในเชลล์ได้เช่นกัน
kaleissin

14
ดูเหมือนว่า Git ไม่ได้ตระหนักถึงรูปแบบวันที่ของสถานที่ดังนั้นเพื่อให้ถูกต้องสมบูรณ์คุณจะต้องทำสิ่งนี้:LANG= GIT_COMMITTER_DATE="`date`" git commit --amend --date "`date`"
MichałGóral

ฉันทำอย่างนั้นเมื่อฉัน rebase และสควอชสาขาดังนั้นมันจะสร้างการกระทำเดียวที่มีการประทับเวลาที่ปรับปรุง
ลุค Ehresman

12
--date "now"คุณยังสามารถเพียงแค่ทำ Git> = 2 จะตีความสิ่งนั้น
wisbucky

189

git commit --amend --reset-author --no-editเพียงแค่ทำ สำหรับ commits ที่เก่ากว่าคุณสามารถทำการ rebase เชิงโต้ตอบและเลือกeditการกระทำที่มีวันที่ที่คุณต้องการแก้ไข

git rebase -i <ref>

จากนั้นแก้ไขการคอมมิทด้วย--reset-authorและ--no-editเพื่อเปลี่ยนวันที่ของผู้แต่งเป็นวันที่ปัจจุบัน:

git commit --amend --reset-author --no-edit

ในที่สุดก็ดำเนินการต่อกับการคืนเงินแบบโต้ตอบของคุณ:

git rebase --continue

5
ใช้งานได้ดี--reset-authorมันใหม่ใน git 1.6.6 (อ้างอิงgitlog.wordpress.com/2010/01/13/git-1-6-6 )
Tim Abell

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

4
หมายเหตุ--reset-authorจะรีเซ็ตทั้งผู้สร้างและวันที่ผู้แต่งเป็นตอนนี้
wisbucky

สิ่งนี้จะเปลี่ยน "COMMITTER DATE" ในเวลาเดียวกันหรือไม่
luochen1990

134

ฉันเขียนสคริปต์และแพ็คเกจ Homebrew สำหรับสิ่งนี้ ติดตั้งง่ายสุดคุณสามารถค้นหาได้ในPotatoLabs/git-redateหน้าGitHub

ไวยากรณ์:

git redate -c 3

คุณต้องเรียกใช้git redateและคุณจะสามารถแก้ไขวันที่ทั้งหมดในกลุ่มของ 5 คอมมิทล่าสุด (นอกจากนี้ยังมี-cตัวเลือกสำหรับจำนวนคอมมิทที่คุณต้องการย้อนกลับ แจ้งให้เราทราบหากคุณมีคำถามความคิดเห็นหรือข้อเสนอแนะ!

ป้อนคำอธิบายรูปภาพที่นี่


2
สิ่งที่ดีแม้ว่าฉันจะต้องใช้เสียงเรียกเข้าแทนนาโน
howdoyouturnthison

ขอบคุณ @Edmund สำหรับสคริปต์ที่ยอดเยี่ยม ฉันไม่เห็นวันที่แก้ไขใน vi หลังจากที่ฉันรัน git redate -c สิ่งที่ฉันเห็นคือ% cI | XXXXXXXXXXXXXXXX | กระทำครั้งแรก คุณช่วยได้ไหม ขอบคุณ
Kiem Nguyen

@ KiemNguyen คุณสามารถลอง git redate (โดยไม่มี -c) ได้หรือไม่
bigpotato

4
เห็นด้วยอย่างสมบูรณ์กับ Mina และ @howdoyouturnthison ที่นี่ทำไมคุณไม่ทำให้มันเป็นผู้ไม่เชื่อเรื่องพระเจ้าผ่านตัวแปรสภาพแวดล้อม EDITOR? (เช่นฉันอยู่บน linux ไม่ใช่ mac ... )
ympostor

3
ขอบคุณ @Edmund! ในกรณีที่สคริปต์ของคุณมีปัญหากับการจัดการค่าเริ่มต้นสำหรับ COMMITS หากยังไม่ได้ตั้งค่ารหัสต่อไปนี้จะใช้ตัวกรองกับการกระทำครั้งสุดท้าย (ฉันเดา / พบ) "git filter-branch -f --env-filter" $ ENVFILTER "HEAD ~ $ COMMITS .. HEAD> / dev / null"
Grigory Entin

102

การกระทำแต่ละครั้งจะเชื่อมโยงกับสองวันที่วันที่จ่ายเงินและวันที่ผู้แต่ง คุณสามารถดูวันที่เหล่านี้ได้ด้วย:

git log --format=fuller

หากคุณต้องการเปลี่ยนวันที่ผู้เขียนและวันที่ผู้ส่ง 6 ครั้งล่าสุดคุณสามารถใช้การปฏิเสธแบบโต้ตอบได้:

git rebase -i HEAD~6

.

pick c95a4b7 Modification 1
pick 1bc0b44 Modification 2
pick de19ad3 Modification 3
pick c110e7e Modification 4
pick 342256c Modification 5
pick 5108205 Modification 6

# Rebase eadedca..5108205 onto eadedca (6 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit

สำหรับการกระทำทั้งหมดที่คุณต้องการเปลี่ยนวันที่ให้แทนที่pickด้วยedit(หรือเพียงแค่e) จากนั้นบันทึกและออกจากโปรแกรมแก้ไขของคุณ

ตอนนี้คุณสามารถแก้ไขการกระทำแต่ละรายการโดยการระบุวันที่ผู้แต่งและวันที่ส่งในรูปแบบ ISO-8601:

GIT_COMMITTER_DATE="2017-10-08T09:51:07" git commit --amend --date="2017-10-08T09:51:07"

วันแรกคือวันที่ส่งมอบวันที่สองคือวันที่เขียน

จากนั้นไปที่ขั้นตอนถัดไปด้วย:

git rebase --continue

ทำขั้นตอนนี้ซ้ำจนกว่าคุณจะแก้ไขข้อผูกพันทั้งหมด git statusตรวจสอบความคืบหน้าของคุณด้วย


1
ฉันติดตามสิ่งนี้และจบลงด้วยการ 'ถอดหัว'!
Simon H

1
@Simon H ฉันได้ทดสอบคำตอบของฉันอีกครั้งและมันใช้ได้ดี คุณควรจะพิมพ์สิ่งที่แตกต่างหรือคุณอยู่ในหัวเดี่ยว git checkout name-of-current-branchหากคุณต้องการที่จะกลับมาจากหัวเดี่ยวทำ
Ortomala Lokni

3
นี่คือคำตอบที่ดีที่สุดและง่ายที่สุด ปลายเล็กใช้งาน: ใช้--no-edit ในgit commit --amend --no-edit --date=2017-10-08T09:51:07การเก็บเก่ากระทำข้อความ
Mariusz Pawelski

2
คุณอาจต้องการอัปเดตGIT_COMMITTER_DATE ตามที่อธิบายไว้ที่นี่eddmann.com/posts/…
smihael

2
@smihael ขอบคุณสำหรับลิงค์ ฉันได้รวมคำแนะนำของคุณไว้ในคำตอบแล้ว
Ortomala Lokni


44

อาคารtheosp 's คำตอบที่ผมเขียนสคริปต์ที่เรียกว่าgit-cdc(วันเปลี่ยนแปลงการกระทำ) PATHที่ฉันใส่ในของฉัน

ชื่อมีความสำคัญ: git-xxxทุกที่ในPATHอนุญาตให้คุณพิมพ์:

git xxx
# here
git cdc ... 

สคริปต์นั้นกำลังทุบตีแม้ใน Windows (เนื่องจาก Git จะเรียกใช้จากสภาพแวดล้อม msys )

#!/bin/bash
# commit
# date YYYY-mm-dd HH:MM:SS

commit="$1" datecal="$2"
temp_branch="temp-rebasing-branch"
current_branch="$(git rev-parse --abbrev-ref HEAD)"

date_timestamp=$(date -d "$datecal" +%s)
date_r=$(date -R -d "$datecal")

if [[ -z "$commit" ]]; then
    exit 0
fi

git checkout -b "$temp_branch" "$commit"
GIT_COMMITTER_DATE="$date_timestamp" GIT_AUTHOR_DATE="$date_timestamp" git commit --amend --no-edit --date "$date_r"
git checkout "$current_branch"
git rebase  --autostash --committer-date-is-author-date "$commit" --onto "$temp_branch"
git branch -d "$temp_branch"

ด้วยสิ่งนี้คุณสามารถพิมพ์:

git cdc @~ "2014-07-04 20:32:45"

ที่จะรีเซ็ตวันที่ผู้เขียน / กระทำของการกระทำก่อนที่จะ HEAD ( @~) เป็นวันที่ที่ระบุ

git cdc @~ "2 days ago"

นั่นจะรีเซ็ตวันที่ผู้เขียน / ส่งมอบคอมมิชชันก่อน HEAD ( @~) เป็นชั่วโมงเดียวกัน แต่ 2 วันที่ผ่านมา


Ilya Semenovกล่าวถึงในความคิดเห็น :

สำหรับ OS X คุณสามารถติดตั้ง GNU coreutils( brew install coreutils) เพิ่มในPATH( PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH") แล้วใช้2 days agoไวยากรณ์ ""


1
สำหรับฉันสิ่งนี้ใช้ได้กับการอ้างอิงวันที่และเวลาในเครื่องหมายคำพูดเดียว: ไม่ git cdc @~ "2014-07-04 20:32:45เช่นนั้นมันจะไม่รู้จักเวลาและด้วยเหตุนี้จึงได้เวลา 00:00:00 (มันกลายเป็นอาร์กิวเมนต์ที่สาม)
peschü

3
สำหรับ OS X คุณสามารถติดตั้ง GNU coreutils ( brew install coreutils) เพิ่มไปที่ PATH ( PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH") จากนั้นใช้ไวยากรณ์ "2 วันที่ผ่านมา"
Ilya Semenov

1
@IlyaSemenov ที่น่าสนใจ ฉันได้รวมความคิดเห็นของคุณไว้ในคำตอบเพื่อให้มองเห็นได้ชัดเจนขึ้น
VonC

ฉันพยายามใช้ตัวอย่างแรกของคุณ แต่ฉันได้รับ "ร้ายแรง: รูปแบบวันที่ไม่ถูกต้อง:" รูปแบบวันที่ใดที่ Mac OS X คาดหวัง
usbsnowcrash

@usbsnowcrash ไม่แน่ใจใน mac ตัวอย่างที่สอง " 2 days ago" ทำงานหรือไม่
VonC

25

วิธีการแก้ไขวันที่กระทำหลายรายการ

คำตอบอื่น ๆ ไม่สะดวกสำหรับการแก้ไขหลายวันที่กระทำ ฉันกลับมาที่คำถามนี้หลังจากสองสามปีเพื่อแบ่งปันเทคนิค

หากต้องการเปลี่ยนวันที่ของ 4 ครั้งล่าสุดให้ทำดังนี้

git rebase -i HEAD~4

แก้ไข rebase ดังต่อไปนี้โดยแทรกexecบรรทัดเพื่อแก้ไขวันที่ตามต้องการ:

pick 4ca564e Do something
exec git commit --amend --no-edit --date "1 Oct 2019 12:00:00 PDT"
pick 1670583 Add another thing
exec git commit --amend --no-edit --date "2 Oct 2019 12:00:00 PDT"
pick b54021c Add some tests
exec git commit --amend --no-edit --date "3 Oct 2019 12:00:00 PDT"
pick e8f6653 Fix the broken thing
exec git commit --amend --no-edit --date "4 Oct 2019 12:00:00 PDT"

การใช้งานที่ดีของ--amend/ --dateตัวเลือก ง่ายกว่าคำตอบของฉันเองโดยใช้ตัวแปรสภาพแวดล้อม upvoted
VonC

เป็นไปได้ไหมที่จะใช้วันที่ / เวลาปัจจุบันเป็นพารามิเตอร์?
accfews

ที่อัปเดตGIT_AUTHOR_DATEเท่านั้น
Blaise

เรื่อง 'เป็นไปได้ไหมที่จะใช้วันที่ / เวลาปัจจุบันเป็นพารามิเตอร์?': "ตอนนี้" เป็นที่เข้าใจกันว่าเป็นวันที่ที่ถูกต้องดังนั้นบรรทัด exec ด้านบนจะกลายเป็นexec git commit --amend --no-edit --date "now"
Andrew Richards

20

หากก่อนหน้านี้กระทำล่าสุด

git rebase  -i HEAD~2
git commit --amend --date=now

หากคุณกดไปที่ orgin แล้วและสามารถบังคับใช้:

git push --force 

หากคุณไม่สามารถบังคับการผลักได้และถ้าถูกผลักคุณจะไม่สามารถเปลี่ยนการกระทำได้! .


18

นี่คือนามแฝงที่สะดวกที่เปลี่ยนทั้งเวลาการส่งมอบและเวลาของผู้เขียนในการส่งมอบครั้งล่าสุดเป็นเวลาที่ยอมรับโดยdate --date:

[alias]
    cd = "!d=\"$(date -d \"$1\")\" && shift && GIT_COMMITTER_DATE=\"$d\" \
            git commit --amend --date \"$d\""

การใช้งาน: git cd <date_arg>

ตัวอย่าง:

git cd now  # update the last commit time to current time
git cd '1 hour ago'  # set time to 1 hour ago

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

[alias]
    cd = "!d=\"$(date -d \"$1\")\" && shift && \
        git diff-index --cached --quiet HEAD --ignore-submodules -- && \
        GIT_COMMITTER_DATE=\"$d\" git commit --amend -C HEAD --date \"$d\"" \
        || echo >&2 "error: date change failed: index not clean!"

17

ฉันสร้างแพ็กเกจ npm นี้เพื่อเปลี่ยนวันที่ส่งมอบเดิม

https://github.com/bitriddler/git-change-date

ตัวอย่างการใช้งาน:

npm install -g git-change-date
cd [your-directory]
git-change-date

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

หากคุณต้องการเปลี่ยนการมอบหมายโดยแฮเฉพาะเรียกใช้นี้ git-change-date --hash=[hash]


ฉันแค่อยากจะบอกว่านี่ยอดเยี่ยมและใช้งานได้อย่างสวยงาม ขอบคุณคุณช่วยฉันประหยัดเวลาได้มาก!
paranza

17

ฟังก์ชั่นทุบตีต่อไปนี้จะเปลี่ยนเวลาของการกระทำใด ๆ ในสาขาปัจจุบัน

ระวังอย่าใช้ถ้าคุณส่งการกระทำไปแล้วหรือถ้าคุณใช้คำสั่งในสาขาอื่น

# rewrite_commit_date(commit, date_timestamp)
#
# !! Commit has to be on the current branch, and only on the current branch !!
# 
# Usage example:
#
# 1. Set commit 0c935403 date to now:
#
#   rewrite_commit_date 0c935403
#
# 2. Set commit 0c935403 date to 1402221655:
#
#   rewrite_commit_date 0c935403 1402221655
#
rewrite_commit_date () {
    local commit="$1" date_timestamp="$2"
    local date temp_branch="temp-rebasing-branch"
    local current_branch="$(git rev-parse --abbrev-ref HEAD)"

    if [[ -z "$date_timestamp" ]]; then
        date="$(date -R)"
    else
        date="$(date -R --date "@$date_timestamp")"
    fi

    git checkout -b "$temp_branch" "$commit"
    GIT_COMMITTER_DATE="$date" git commit --amend --date "$date"
    git checkout "$current_branch"
    git rebase "$commit" --onto "$temp_branch"
    git branch -d "$temp_branch"
}

1
คุณมีข้อบกพร่องอยู่ที่นั่น: if [[ -z "$commit" ]]->if [[ -z "$date_timestamp" ]]
blueFast

ดี! ฉันอยากจะแนะนำการตั้งค่าGIT_COMMITTER_DATE=ในตอนท้ายของวิธีการเพื่อป้องกันไม่ให้คู่มือเพิ่มเติมมุ่งมั่นที่จะให้วันที่ที่ระบุไว้
loopkin

@loopkin, GIT_COMMITTER_DATE ถูกตั้งค่าสำหรับคำสั่ง "git commit" เท่านั้นดังนั้นจึงไม่จำเป็นต้องล้างมันในภายหลัง
nimrodm

@ nimrodm ฉันเพิ่งทดสอบอีกครั้งและคุณถูกต้อง ขอบคุณสำหรับการชี้ให้เห็นว่า
loopkin

12

หากต้องการเปลี่ยนทั้งวันที่ผู้แต่งและวันที่ตกลง:

GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200"

10

หากคุณต้องการได้รับวันที่แน่นอนของการส่งมอบอีกครั้ง (บอกว่าคุณรีบูตแก้ไขคอมมิชชันและต้องการให้มีวันที่ของเวอร์ชัน pre-rebase ดั้งเดิม):

git commit --amend --date="$(git show -s --format=%ai a383243)"

สิ่งนี้แก้ไขวันที่ของ HEAD ที่ยืนยันว่าเป็นวันที่กระทำ a383243 (รวมถึงตัวเลขที่มากขึ้นหากมีความคลุมเครือ) มันจะปรากฏขึ้นหน้าต่างแก้ไขเพื่อให้คุณสามารถแก้ไขข้อความกระทำ

นั่นคือสำหรับวันที่ผู้เขียนซึ่งเป็นสิ่งที่คุณสนใจมักจะ - ดูคำตอบอื่น ๆ สำหรับวันที่ผู้ส่ง


7

หากคุณต้องการคำตอบที่ได้รับการยอมรับ ( https://stackoverflow.com/a/454750/72809 ) ในบรรทัดคำสั่งมาตรฐานของ Windows คุณต้องใช้คำสั่งต่อไปนี้:

git filter-branch -f --env-filter "if [ $GIT_COMMIT = 578e6a450ff5318981367fe1f6f2390ce60ee045 ]; then export GIT_AUTHOR_DATE='2009-10-16T16:00+03:00'; export GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; fi"

หมายเหตุ:

  • อาจเป็นไปได้ที่จะแบ่งคำสั่งผ่านหลายบรรทัด (Windows รองรับการแบ่งบรรทัดด้วยสัญลักษณ์ carret ^) แต่ฉันไม่ประสบความสำเร็จ
  • คุณสามารถเขียนวันที่ ISO ประหยัดเวลาได้มากในการค้นหาวันที่เหมาะสมของสัปดาห์และความยุ่งยากในการเรียงลำดับองค์ประกอบ
  • หากคุณต้องการให้วันที่ผู้แต่งและผู้กำหนดตรงกันคุณสามารถอ้างอิงตัวแปรที่ตั้งไว้ก่อนหน้านี้ได้

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


7

หากความมุ่งมั่นยังไม่ถูกผลักฉันสามารถใช้บางอย่างเช่นนั้น:

git commit --amend --date=" Wed Mar 25 10:05:44 2020 +0300"

หลังจากนั้น git bash จะเปิดตัวแก้ไขพร้อมกับวันที่นำไปใช้แล้วดังนั้นคุณเพียงแค่ต้องบันทึกมันโดยพิมพ์ในโหมดคำสั่ง VI editor ": wq" และคุณสามารถกดมันได้


2
เพียงเพิ่มคำตอบที่ดี: หากคุณไม่ต้องการแก้ไขข้อความยืนยัน (ถ้าคุณแค่ต้องการเปลี่ยนวันที่ยอมรับ) ให้ใช้--no-editตัวเลือก
Antonio Vinicius Menezes Medei

นอกจากนี้หากการส่งมอบได้กระทำไปแล้วคุณยังสามารถผลักดันส่งมอบการเปลี่ยนแปลงโดยใช้git push -f(การอัปเดตที่บังคับ) ที่อาจมีผลข้างเคียงแม้ว่า (โดยเฉพาะถ้าคนจำนวนมากมีโคลนในพื้นที่เก็บข้อมูล)
อันโตนิโอ Vinicius Menezes Medei


2

มีคำตอบที่ยอดเยี่ยมมากมายอยู่แล้ว แต่เมื่อฉันต้องการเปลี่ยนวันที่หลายคอมมิชชันในหนึ่งวันหรือหนึ่งเดือนฉันไม่พบคำตอบที่เหมาะสม ดังนั้นฉันจึงสร้างสคริปต์ใหม่สำหรับสิ่งนี้ด้วยการอธิบายหวังว่ามันจะช่วยให้ใครบางคน:

#!/bin/bash

# change GIT_AUTHOR_DATE for commit at Thu Sep 14 13:39:41 2017 +0800
# you can change the data_match to change all commits at any date, one day or one month
# you can also do the same for GIT_COMMITTER_DATE

git filter-branch --force --env-filter '

date_match="^Thu, 14 Sep 2017 13+"              

# GIT_AUTHOR_DATE will be @1505367581 +0800, Git internal format 
author_data=$GIT_AUTHOR_DATE;                   
author_data=${author_data#@}                  
author_data=${author_data% +0800}                # author_data is 1505367581     

oneday=$((24*60*60))

# author_data_str will be "Thu, 14 Sep 2017 13:39:41 +0800", RFC2822 format
author_data_str=`date -R -d @$author_data`      

if [[ $author_data_str =~ $date_match ]];
then
    # remove one day from author_data
    new_data_sec=$(($author_data-$oneday))
    # change to git internal format based on new_data_sec
    new_data="@$new_data_sec +0800"             
    export GIT_AUTHOR_DATE="$new_data"
fi
' --tag-name-filter cat -- --branches --tags

วันที่จะมีการเปลี่ยนแปลง:

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