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?
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'
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.
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."
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
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!
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
.
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 doPATH
(PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
) a następnie użyj składni "2 days ago
".
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"
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! .
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"
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!"
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" /
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"
}
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"
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]
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.
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
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