Как да промените времевия печат на стария ангажимент в git?

Отговори на Как да се променят съществуващите, освободени обвързаности? Описва как да се променят предишни съобщения за корекции, които все още не са преместени нагоре. Новите съобщения наследяват времевите маркери на оригиналните съобщения. Изглежда логично, но има ли начин да настроите времето отново?

602
18 янв. зададен от Dhskjlkakdh 18 януари. 2009-01-18 09:13 '09 в 9:13 2009-01-18 09:13
@ 17 отговора

Използвайте git filter-branch с env филтър, който sets 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' 
450
18 янв. Отговорът е даден на Дъстин 18 януари 2009-01-18 09:48 '09 в 9:48 2009-01-18 09:48

Можете да извършите интерактивно рестартиране и да изберете редактиране, за да поправите, чиято дата искате да промените. Когато процесът на преинсталиране спре, за да направите промени в въведеното, например:

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

След това ще продължите интерактивното си рестартиране.

UPDATE (в отговор на коментара на studgeek): променете датата на фиксиране вместо датата на автора:

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

В горните редове е зададена променливата на средата GIT_COMMITTER_DATE, която се използва при промяната на фиксацията.

Всички тествани в Git Bash.

655
16 февр. Отговорът е даден от Павел Pladijs 16 февруари. 2011-02-16 16:50 '11 в 16:50 2011-02-16 16:50

Най-добрият начин да се справите с всички тези предложения в един отбор е

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

Това ще зададе последния запис на запис и датата на автора в момента.

347
14 марта '12 в 14:32 2012-03-14 14:32 отговорът е даден от Лука Ехресман 14 март, '12 в 14:32 ч. 2012-03-14 14:32

Просто направете git commit --amend --reset-author --no-edit . За по-стари коммитирания, можете да изпълните интерактивно рестартиране и да изберете edit за ангажиране, чиято дата искате да промените.

 git rebase -i <ref> 

След това променете ангажимента, като използвате --reset-author и --no-edit да промените датата на автора на текущата дата:

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

И накрая, продължете с интерактивната си рестартиране:

 git rebase --continue 
142
21 июля '15 в 16:25 2015-07-21 16:25 отговорът е даден от Miguel de Val-Borro на 21 юли в 16:25 ч. 2015-07-21 16:25

Написах скрипт и Homebrew пакет за това. Супер лесен за инсталиране, можете да го намерите на PotatoLabs/git-redate GitHub PotatoLabs/git-redate .

синтаксис:

 git redate -c 3 

Просто трябва да стартирате git redate и можете да редактирате всички дати във vim last 5 -c (също има опция -c за колко -c искате да се върнете, по подразбиране е 5), уведомете ме, ако имате някакви Всички въпроси, коментари или предложения!

2019

17 окт. отговор, даден Edmund Окт 17 2016-10-17 23:24 '16 в 23:24 2016-10-17 23:24

Всяка корекция се свързва с две дати, датата на изпълнителя и датата на автора. Можете да видите тези дати от:

 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 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 .

66
02 февр. Отговорът е даден от Ortomala Lokni 02 Feb. 2017-02-02 11:50 '17 в 11:50 2017-02-02 11:50

На базата на theosp отговора , аз написах скрипт, наречен git-cdc (за да фиксирам датата на промяната), който влязох в PATH .

Важно: git-xxx навсякъде в PATH ви позволява да въведете:

 git xxx # here git cdc ... 

Какъв скрипт е в bash, дори и в Windows (тъй като Git ще го извика от msys )

40
05 июля '14 в 12:29 2014-07-05 12:29 отговорът е даден от VonC на 05 юли 14 в 12:29 2014-07-05 12:29

Това променя датата (timestamp) за последното фиксиране.

git commit --amend --date "Thu May 28 18:21:46 2015 +0530"

26
02 июня '15 в 16:04 2015-06-02 16:04 отговорът е даден Nishant 02 юни '15 в 16:04 2015-06-02 16:04
 git commit --amend --date="now" 
22
07 апр. Отговор от Harald Nordgren 07 април 2018-04-07 18:16 '18 в 18:16 ч. 2018-04-07 18:16

ако това е предишната последна поправка.

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

Ако вече кликнете върху orgin и можете да използвате насилствено:

 git push --force 

ако не можете да натиснете силно и ако е натиснат, не можете да промените фиксацията!,

18
25 апр. отговор, даден от Сергей 25 април 2016-04-25 03:34 '16 в 3:34 2016-04-25 03:34

Тук е удобен псевдоним, който променя времето на поемане и автор на последното фиксиране за времето, взето до 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 > "error: date change failed: index not clean!" 
15
16 мая '14 в 8:41 2014-05-16 08:41 отговора е даден на 16 май , 14 в 8:41 2014-05-16 08:41

Създадох този 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]

9
25 нояб. отговорът е даден от Kareem Elbahrawy 25 ноември 2017-11-25 01:20 '17 в 1:20 2017-11-25 01:20

Следващата функция bash ще промени времето на всяко поемане в текущия клон.

Внимавайте да не използвате, ако вече сте натиснали ангажимент или използвате коммит в друг клон.

 # 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" } 
8
08 июня '14 в 13:10 2014-06-08 13:10 даден от theosp на 08 юни '14 в 13:10 2014-06-08 13:10

Ако искате да получите точната дата на друг ангажимент (да речем, че сте направили повторно корекцията и искате тя да има дата на първоначалната версия за предварително зареждане):

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

Това коригира датата на фиксиране на HEAD като точната дата на фиксиране на a383243 (по-неясна, ако има неясноти). Той също ще покаже прозорец на редактора, така че можете да редактирате съобщението за фиксиране.

Що се отнася до датата на автора, който обикновено се интересува, вижте други отговори за датата на издаване.

8
18 нояб. отговорът е даден на Mr_and_Mrs_D 18 ноември. 2016-11-18 14:17 '16 в 14:17 часа 2016-11-18 14:17

За да промените датата на автора и датата на фиксиране:

 GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200" 
7
23 сент. отговорът е даден на Jan H 23 Sep. 2015-09-23 10:41 '15 в 10:41 ч. 2015-09-23 10:41

Ако искате да изпълните приетия отговор ( medican.info.site/questions/5133 / ... ) в стандартния команден ред на 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 поддържа разделяне на линии с символа на каретата ^ ), но не успях.
  • Можете да напишете ISO дати, спестявайки много време за търсене на точния ден от седмицата и общо разочарование от реда на елементите.
  • Ако искате датата на оторизиране и датата на реда да бъде една и съща, можете просто да препратите към предишната зададена променлива.

Благодаря много за публикуването на блог пост на Колин Суинген . Въпреки факта, че неговият код не работи за мен, той ми помогна да намеря правилното решение.

4
05 февр. отговорът е даден от Петър на 05 февруари 2016-02-05 11:58 '16 в 11:58 2016-02-05 11:58

Вече има много добри отговори, но когато искам да променя датата на няколко ангажирания за един ден или месец, не намирам точния отговор. Затова създавам нов скрипт за това с обяснение, надявам се, че това ще помогне на някой:

 #!/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 
1
14 сент. Отговорът е даден detective0922 14 сеп. 2017-09-14 13:24 '17 в 13:24 часа 2017-09-14 13:24

Други въпроси относно маркерите или Ask a Question