Как можно изменить временную метку старого коммита в Git?
ответы Как изменить существующие, не очищенные коммиты? опишите способ изменения предыдущих сообщений фиксации, которые еще не были отправлены вверх по течению. Новые сообщения наследуют временные метки исходных коммитов. Это кажется логичным,но есть ли способ также изменить время?
17 ответов:
использовать
git filter-branchс фильтром env, который устанавливает GIT_AUTHOR_DATE и GIT_COMMITTER_DATE для конкретного хэша фиксации, которую вы хотите исправить.это аннулирует это и все будущие хэши.
пример:
Если вы хотите изменить времени из commit
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'
Вы можете сделать интерактивный rebase и выберите edit для фиксации, дату которой вы хотели бы изменить. Когда процесс перебазирования останавливается для изменения фиксации, которую вы вводите, например:
git commit --amend --date="Wed Feb 16 14:00 2011 +0100"после этого вы продолжите интерактивную перебазировку.
обновление (в ответ на комментарий studgeek): чтобы изменить дату фиксации вместо даты автора:
GIT_COMMITTER_DATE="Wed Feb 16 14:00 2011 +0100" git commit --amendстроки выше задают переменную окружения GIT_COMMITTER_DATE, который используется в amend commit.
все тестируется в Git Bash.
лучший способ обработать все эти предложения в одной команде -
LC_ALL=C GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"это установит дату фиксации и автора последнего коммита в "прямо сейчас."
просто делать
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
Я написал сценарий и доморощенный пакет для этого. Супер проста в установке, вы можете найти его на GitHub
PotatoLabs/git-redateстраница.синтаксис:
git redate -c 3вы просто должны запустить
git redateи вы сможете редактировать все даты в vim из последних 5 коммитов (есть также-cопция для того, сколько коммитов вы хотите вернуться, это просто по умолчанию 5). Дайте мне знать, если у вас есть какие-либо вопросы, комментарии или предложения!
каждая фиксация связана с двумя датами, датой фиксатора и датой автора. Вы можете просмотреть эти даты с помощью:
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для всех коммитов, где вы хотите изменить дату, заменить
pickbyedit(или просто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.
дом на theosp ' s ответ, я написал сценарий под названием
git-cdc(для фиксации даты изменения), что я положил в мойPATH.имя важно:
git-xxxгде вPATHпозволяет типа:git xxx # here git cdc ...этот скрипт находится в bash, даже на Windows (так как Git будет вызывать его из своего среда msys)
#!/bin/bash # commit # date YYYY-mm-dd HH:MM:SS commit="" datecal="" 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"что бы сбросить автор / фиксацию даты фиксации перед заголовком (
@~) до указанной даты.git cdc @~ "2 days ago"что бы сбросить дату автора / фиксации фиксации перед головой (
@~) в тот же час, но 2 дня назад.
Илья Семенов упоминает в комментариях:
для OS X вы также можете установить GNU
coreutils(brew install coreutils), добавить его вPATH(PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH") и затем с помощью "2 days ago" синтаксис.
это изменяет дату (метку времени) для последней фиксации
git commit --amend --date "Thu May 28 18:21:46 2015 +0530"
если это предыдущий коммит.
git rebase -i HEAD~2 git commit --amend --date=nowЕсли вы уже нажимаете на орган и можете заставить использовать:
git push --forceЕсли вы не можете заставить толчок, и если он нажат, вы не можете изменить фиксацию! .
вот удобный псевдоним, который изменяет время фиксации и автора последнего фиксации на время, принятое
date --date:[alias] cd = "!d=\"$(date -d \"\")\" && 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 agoEdit: Вот более автоматизированная версия, которая проверяет, что индекс чист (без незафиксированных изменений) и повторно использует последнее сообщение фиксации или не работает иначе (защита от ошибок):
[alias] cd = "!d=\"$(date -d \"\")\" && 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!"
Если вы хотите получить точную дату другого коммита (скажем, вы изменили коммит и хотите, чтобы у него была дата исходной предварительной версии):
git commit --amend --date="$(git show -s --format=%ai a383243)"это исправляет дату фиксации головы быть ровно дата фиксации a383243 (включите больше цифр, если есть неясности). Он также появится окно редактора, так что вы можете редактировать сообщение фиксации.
Это для даты автора, которая является то, что вы заботитесь о обычно-см. Другие ответы для даты фиксатора.
следующая функция 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="" date_timestamp="" 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" }
чтобы изменить дату автора и дату фиксации:
GIT_COMMITTER_DATE="Wed Sep 23 9:40 2015 +0200" git commit --amend --date "Wed Sep 23 9:40 2015 +0200"
Я создал этот пакет 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]
Если вы хотите выполнить принятый ответ (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, экономя много времени на поиск нужного дня недели и вообще разочарование по поводу порядка элементов.
- если вы хотите, чтобы дата автора и фиксатора была одинаковой, вы можете просто ссылаться на ранее заданную переменную.
большое спасибо к сообщение в блоге Колина Свингена. Хотя его код не работал для меня, он помог мне найти правильное решение.
уже есть много отличных ответов, но когда я хочу изменить дату для нескольких коммитов в один день или в один месяц, я не нахожу правильного ответа. Поэтому я создаю новый скрипт для этого с объяснением, надеюсь, что это поможет кому-то:
#!/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

Comments