Jak zmienić znacznik czasu starego commita w Git?

Odpowiedzi na jak zmodyfikować istniejące, nieużywane commity? opisz sposób zmiany poprzednich komunikatów commitów, które nie zostały jeszcze popchnięte pod prąd. Nowe wiadomości dziedziczą znaczniki czasu oryginalnych zmian. Wydaje się to logiczne, ale czy istnieje sposób, aby ponownie ustawić czas?

Author: Community, 2009-01-18

17 answers

Użyj git filter-branch z filtrem env, który ustawia GIT_AUTHOR_DATE i GIT_COMMITTER_DATE dla specyficznego hasha commita, który chcesz naprawić.

To unieważni to i wszystkie przyszłe skróty.

Przykład:

Jeśli chcesz zmienićdaty commit119f9ecf58069b265ab22f1f97d2b648faf932e0, możesz to zrobić za pomocą czegoś takiego:

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'
 431
Author: Dustin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-07 21:34:40

Możesz wykonać interaktywną rebase i wybrać edit dla commita, którego datę chcesz zmienić. Gdy proces rebase zatrzymuje się w celu zmiany commita, wpisujesz na przykład:

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

Następnie kontynuujesz interaktywną rebase.

UPDATE (w odpowiedzi na komentarz studgeeka): aby zmienić datę zatwierdzenia zamiast daty autora:

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

Powyższe linie ustawiają zmienną środowiskową GIT_COMMITTER_DATE, która jest używana w enend / align = "left" /

Wszystko jest testowane w Git Bash.

 632
Author: Paul Pladijs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-20 19:51:57

Lepszym sposobem obsługi wszystkich tych sugestii w jednym poleceniu jest

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

To ustawi datę zatwierdzenia ostatniego commita i autora na " right now."

 342
Author: Luke Ehresman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-24 02:57:36

Po prostu zrób git commit --amend --reset-author --no-edit. W przypadku starszych zmian możesz wykonać interaktywną rebase i wybrać edit dla zmian, których datę chcesz zmodyfikować.

git rebase -i <ref>

Następnie zmień commit za pomocą --reset-author i --no-edit, aby zmienić datę autora na bieżącą:

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

W końcu kontynuuj swoją interaktywną rebase:

git rebase --continue
 131
Author: Miguel de Val-Borro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-30 23:29:47

Napisałem do tego skrypt i pakiet Homebrew. Bardzo łatwy w instalacji, można go znaleźć na GitHub PotatoLabs/git-redate strona.

Składnia:

git redate -c 3

Musisz po prostu uruchomić git redate i będziesz mógł edytować wszystkie daty w Vimie ostatnich 5 commitów (istnieje również opcja -c dla ilu commitów chcesz cofnąć, domyślnie jest to 5). Daj mi znać, jeśli masz jakieś pytania, komentarze lub sugestie!

Tutaj wpisz opis obrazka

 71
Author: Edmund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 12:02:32

Każdy commit jest powiązany z dwiema datami, datą zatwierdzającego i datą autora. Możesz zobaczyć te daty za pomocą:

git log --format=fuller

Jeśli chcesz zmienić datę autora i datę zatwierdzania ostatnich 6 zatwierdzeń, możesz po prostu użyć interaktywnej rebase :

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

Dla wszystkich zmian, w których chcesz zmienić datę, zastąp pick przez edit (lub po prostu e), a następnie zapisz i zamknij Edytor.

Możesz teraz zmienić każdy commit, podając autora Data i data zatwierdzenia w formacie ISO-8601:

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

Pierwsza data to data zatwierdzenia, druga to data autora.

Następnie przejdź do następnego commita za pomocą :

git rebase --continue

Powtarzaj proces, dopóki nie zmienisz wszystkich zmian. Sprawdź swoje postępy za pomocą git status.

 61
Author: Ortomala Lokni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-31 08:59:51

Bazując na theosp 'S answer, napisałem skrypt o nazwie git-cdc (do zmiany daty commit), który umieściłem w moim PATH.

Nazwa jest ważna: git-xxx gdziekolwiek w twoim PATH pozwala na wpisanie:

git xxx
# here
git cdc ... 
Ten skrypt jest w bash, nawet w Windows (ponieważ Git będzie wywoływał go ze swojego środowiska 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"

Tym możesz wpisać:

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

, które zresetowałyby autora/datę commitu przed HEAD (@~) do określona data.

git cdc @~ "2 days ago"

To zresetowałoby autora/datę commitu przed HEAD (@~) na tę samą godzinę, ale 2 dni temu.


Ilya Semenov wspomina w komentarzach :

Dla OS X można również zainstalować GNU coreutils (brew install coreutils), Dodaj do PATH (PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH") a następnie użyj składni " 2 days ago".

 40
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:36

To zmienia datę (znacznik czasu) dla ostatniego commita

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

 26
Author: Nishant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-02 13:04:24

Jeśli jest to poprzedni ostatni commit.

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

Jeśli już naciskasz na orgin i możesz wymusić użycie:

git push --force 

Jeśli nie możesz wymusić naciśnięcia i jeśli zostanie ono naciśnięte, nie możesz zmienić commita! .

 18
Author: Sérgio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 00:34:39
git commit --amend --date="now"
 18
Author: Harald Nordgren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-07 15:16:42

Oto wygodny alias, który zmienia zarówno czas zatwierdzenia, jak i autora ostatniego zatwierdzenia na czas zaakceptowany przez date --date:

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

Użycie: git cd <date_arg>

Przykłady:

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

Edit: Poniżej znajduje się bardziej zautomatyzowana wersja, która sprawdza, czy indeks jest czysty (bez niezakontraktowanych zmian) i ponownie wykorzystuje ostatnią wiadomość zatwierdzającą lub nie powiedzie się w inny sposób (fool-proof):

[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!"
 14
Author: eold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-16 05:58:09

Jeśli chcesz uzyskać dokładną datę innego commita (powiedzmy, że zmieniasz zmiany i chcesz, aby miały datę oryginalnej wersji przed rebazą):

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

To koryguje datę commitu głównego na Dokładnie datę commitu a383243 (dodaj więcej cyfr, jeśli istnieją niejasności). Pojawi się również okno edytora, dzięki któremu będziesz mógł edytować wiadomość o zatwierdzeniu.

To jest data autora, czyli to, na co zwykle Ci zależy-zobacz inne odpowiedzi na / align = "left" /

 8
Author: Mr_and_Mrs_D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-18 11:17:18

Następująca funkcja bash zmieni czas każdego zatwierdzenia w bieżącej gałęzi.

Uważaj, aby nie używać, jeśli już nacisnąłeś commit lub jeśli używasz commit w innej gałęzi.

# 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
Author: theosp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-09 10:28:56

Aby zmienić zarówno datę autora, jak i datę zatwierdzenia:

GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200"
 6
Author: Jan H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 07:41:28

Stworzyłem ten pakiet npm, aby zmienić datę starych commitów.

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

Przykładowe Użycie:

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

Zostaniesz poproszony o wybranie zmiany, którą chcesz zmodyfikować, a następnie o wprowadzenie nowej daty.

Jeśli chcesz zmienić commit przez określony hash uruchom to git-change-date --hash=[hash]

 6
Author: Kareem Elbahrawy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-24 22:20:39

Jeśli chcesz wykonać zaakceptowaną odpowiedź ( https://stackoverflow.com/a/454750/72809 ) w standardowym wierszu poleceń systemu Windows potrzebne jest następujące polecenie:

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"

Uwagi:

  • możliwe jest podzielenie polecenia na wiele linii (Windows obsługuje dzielenie linii za pomocą symbolu Carreta ^), ale mi się nie udało.
  • możesz pisać daty ISO, oszczędzając dużo czasu na znalezienie odpowiedniego dnia tygodnia i ogólną frustrację nad kolejnością żywioły.
  • Jeśli chcesz, aby Data autora i zatwierdzającego była taka sama, możesz odwołać się do wcześniej ustawionej zmiennej.

Wielkie dzięki dla blogu przez Colin Svingen . Mimo że jego kod nie działał dla mnie, pomógł mi znaleźć właściwe rozwiązanie.

 4
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:29

Jest już wiele świetnych odpowiedzi, ale kiedy chcę zmienić datę dla wielu commitów w ciągu jednego dnia lub miesiąca, nie znajduję właściwej odpowiedzi. Więc tworzę nowy skrypt do tego z explaintion, mam nadzieję, że komuś pomoże:

#!/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 zostanie zmieniona:

AuthorDate: Wed Sep 13 13:39:41 2017 +0800
 1
Author: detective0922,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-15 01:57:05