Kaip pakeisti senojo įsipareigojimo laiko žymą git?

Atsakymai į tai, kaip pakeisti esamus, nesuvaldomus įsipareigojimus? Apibūdina, kaip pakeisti ankstesnius pranešimus, kurie dar nebuvo perkelti į viršų. Nauji pranešimai paveldi originalių įsipareigojimų laiko žymes. Atrodo logiška, bet ar yra būdas vėl nustatyti laiką?

602
18 янв. Dhskjlkakdh 18 d. 2009-01-18 09:13 '09, 9:13 2009-01-18 09:13
@ 17 atsakymų

Naudokite „ git filter-branch su „env“ filtru, kuris sets GIT_AUTHOR_DATE ir GIT_COMMITTER_DATE , kad būtų nustatytas konkretus įsipareigojimo, kurį norite pataisyti, hash.

Tai panaikina visus būsimus maišus.

Pavyzdys:

Jei norite pakeisti įsipareigojimo datą 119f9ecf58069b265ab22f1f97d2b648faf932e0 , galite tai padaryti taip:

 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 янв. Atsakymas duotas Dustin Jan 18 2009-01-18 09:48 '09 ne 9:48 2009-01-18 09:48

Galite atlikti interaktyvų perkėlimą ir pasirinkti redaguoti, kad ją išspręstumėte, kurio datą norite pakeisti. Kai diegimo procesas sustabdomas, pakeiskite įvestą įsipareigojimą, pvz .:

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

Tada tęsite savo interaktyvų perkėlimą.

ATNAUJINIMAS (atsakydamas į studijos komentarą): pakeiskite nustatymo datą vietoj autoriaus datos:

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

Pirmiau pateiktose eilutėse nustatytas GIT_COMMITTER_DATE aplinkos kintamasis, kuris naudojamas atliekant pakeitimus.

Visi išbandyti Git Bash.

655
16 февр. Atsakymą pateikė Paul Pladijs 16 vasaris. 2011-02-16 16:50 '11, 16:50, 2011-02-16 16:50

Geriausias būdas valdyti visus šiuos pasiūlymus vienoje komandoje yra

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

Tai dabar paskirs paskutinį įrašo įrašą ir autoriaus datą.

347
14 марта '12 в 14:32 2012-03-14 14:32 atsakymą pateikė Luke Ehresman kovo 14 d., 12 val. 14:32 2012-03-14 14:32

Tiesiog padarykite git commit --amend --reset-author --no-edit . Jei norite atlikti senesnius įsipareigojimus, galite atlikti interaktyvų perkėlimą ir pasirinkti edit kad įvykdytumėte, kurio datą norite pakeisti.

 git rebase -i <ref> 

Tada pakeiskite įsipareigojimą naudodami --reset-author ir --no-edit kad pakeistumėte autoriaus datą iki dabartinės datos:

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

Galiausiai tęskite interaktyvų perkėlimą:

 git rebase --continue 
142
21 июля '15 в 16:25 2015-07-21 16:25 atsakymą pateikė Miguel de Val-Borro liepos 15 d. 15:25 2015-07-21 16:25

Tam parašiau scenarijų ir „Homebrew“ paketą. Super lengva įdiegti, jį galite rasti „ PotatoLabs/git-redate GitHub PotatoLabs/git-redate .

Sintaksė:

 git redate -c 3 

Jums tereikia paleisti „ git redate ir jūs galite redaguoti visas vim paskutinių 5- -c datas (taip pat yra parinktis -c , kiek -c norite grąžinti, numatytasis yra 5), ​​leiskite man žinoti, jei turite kokių nors Visi klausimai, komentarai ar pasiūlymai!

2019

17 окт. atsakymas duotas Edmund 17 spalis 2016-10-17 23:24 '16 at 23:24 2016-10-17 23:24

Kiekvienas įsipareigojimas yra susietas su dviem datomis, dalininko data ir autoriaus data. Šias datas galite peržiūrėti:

 git log --format=fuller 

Jei norite pakeisti autoriaus datą ir paskutinių 6 įvykių datą, galite tiesiog naudoti interaktyvų perkėlimą:

 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 

Visiems įsipareigoja, kur norite pakeisti datą, pakeiskite komandą su edit (arba tiesiog e ), tada išsaugokite ir išeikite iš redaktoriaus.

Dabar galite pakeisti kiekvieną įvykį, nurodydami autoriaus datą ir kvitininko datą ISO-8601 formatu:

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

Pirmoji data yra įsipareigojimo data, antroji - autoriaus data.

Tada pereikite prie kito įsipareigojimo su:

 git rebase --continue 

Pakartokite procesą, kol išsprendžiate visus savo įsipareigojimus. Patikrinkite savo progresavimą su „ git status .

66
02 февр. Atsakymą pateikė Ortomala Lokni 02 vasario 2 d. 2017-02-02 11:50 '17 at 11:50 2017-02-02 11:50

Remiantis atsakymais , parašiau scenarijų, pavadintą „ git-cdc (norėdamas nustatyti pakeitimo datą), kurį įvedžiau į „ PATH .

Svarbu: „ git-xxx bet kurioje jūsų PATH galite įvesti:

 git xxx # here git cdc ... 

Koks scenarijus yra „bash“, net ir „Windows“ (nes „Git“ jį vadins „msys“ )

40
05 июля '14 в 12:29 2014-07-05 12:29 atsakymą pateikė VonC liepos 5 d. 14 d. 12:29 2014-07-05 12:29

Tai pakeičia paskutinio įvykio datą (laiko žymę).

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

26
02 июня '15 в 16:04 2015-06-02 16:04 atsakymas suteiktas Nishant 02 birželio 15 d. 16:04 2015-06-02 16:04
 git commit --amend --date="now" 
22
07 апр. Harald Nordgren atsakymas 07 Bal 2018-04-07 18:16 '18, 18:16 pm 2018-04-07 18:16

jei tai yra paskutinis paskutinis pataisymas.

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

Jei jau spustelėjote organą ir galite naudoti:

 git push --force 

jei negalite griežtai paspausti ir, jei jis yra paspaudžiamas, negalėsite keisti įrašo!,

18
25 апр. Sérgio atsakymas 25 Bal 2016-04-25 03:34 '16 at 3:34 2016-04-25 03:34

Čia yra patogus pseudonimas, kuris pakeičia įvykdymo laiką ir paskutinio įsipareigojimo autorių už laiką, iki kurio iki date --date :

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

Naudojimas: git cd <date_arg>

Pavyzdžiai:

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

Redaguoti: čia yra automatizuota versija, kuri patikrina, ar indeksas yra švarus (be jokių pakeitimų), ir pakartotinai naudoja paskutinį pranešimą apie įvykį, arba neveikia kitaip (patikrinta su klaida):

 [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 atsakymas įteiktas gegužės 16, 14 d ., 8:41, 2014-05-16 08:41

Sukūriau paketą „npm“, kad pakeistumėte senų įsipareigojimų datą.

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

Naudojimo pavyzdys:

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

Jums bus pasiūlyta pasirinkti įsipareigojimą, kurį norite pakeisti, ir įveskite naują datą.

Jei norite pakeisti įsipareigojimą tam tikram git-change-date --hash=[hash] , paleiskite git-change-date --hash=[hash]

9
25 нояб. atsakymą pateikė Kareem Elbahrawy lapkričio 25 d 2017-11-25 01:20 '17 at 1:20 2017-11-25 01:20

Toliau nurodyta „bash“ funkcija pakeis bet kurio įsipareigojimo dabartiniame filiale laiką.

Būkite atsargūs, jei nenaudojate, jei jau padarėte įsipareigojimą arba jei naudojate įsipareigojimą kitoje šakoje.

 # 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“ atsakymas birželio 8 d. 14 d. 13:10 2014-06-08 13:10

Jei norite gauti tikslią kito įsipareigojimo datą (tarkim, iš naujo ištaisysite pataisą ir norite, kad ji būtų pradinės pradinės versijos data):

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

Tai ištaiso HEAD fiksavimo datą kaip tikslią a383243 fiksavimo datą (labiau dviprasmiška, jei yra dviprasmybių). Taip pat bus atidarytas redaktoriaus >

Kalbant apie autoriaus, kuris paprastai domisi, datą, žiūrėkite kitus atsakytojo datos atsakymus.

8
18 нояб. atsakymas pateiktas p. _and_Mrs_D 18 nov. 2016-11-18 14:17 '16 at 14:17 pm 2016-11-18 14:17

Norėdami pakeisti autoriaus datą ir įrašymo datą:

 GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200" 
7
23 сент. atsakymas pateiktas sausio 23 d. 2015-09-23 10:41 '15 , 10:41 am 2015-09-23 10:41

Jei norite atlikti priimtą atsakymą ( ngn-wiki.ru.site/questions/5133 / ... ) standartinėje „Windows“ komandinėje eilutėje, jums reikės šios komandos:

 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" 

Pastabos:

  • Galbūt jūs galite suskirstyti komandą į kelias eilutes („Windows“ palaiko linijų suskaidymą su „carret“ simboliu), bet man nepavyko.
  • Galite parašyti ISO datas, taupydami daug laiko ieškodami tinkamos savaitės dienos ir bendrai nusivylę elementų tvarka.
  • Jei norite, kad Data Author ir Committer būtų vienodi, galite tiesiog nurodyti anksčiau nustatytą kintamąjį.

Labai ačiū, kad parašėte „ Colin Swingen“ dienoraščio įrašą . Nepaisant to, kad jo kodas man neveikė, jis man padėjo rasti tinkamą sprendimą.

4
05 февр. atsakymas pateikiamas Peterio vasario 05 d 2016-02-05 11:58 '16 at 11:58 2016-02-05 11:58

Jau yra daug puikių atsakymų, bet kai noriu pakeisti keleto įsipareigojimų datą per vieną dieną ar mėnesį, nerandu teisingo atsakymo. Todėl sukuriu naują scenarijų su paaiškinimu, tikiuosi, kad tai padės kam nors:

 #!/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 

Data bus pakeista:

 AuthorDate: Wed Sep 13 13:39:41 2017 +0800 
1
14 сент. Atsakymas pateikiamas detective0922 14 sep. 2017-09-14 13:24 '17, 13:24 pm 2017-09-14 13:24