Мне нужно сделать несколько коммитов с помощью Git, но я бы хотел, чтобы метка времени в git-log была в будущем.
Как я могу сделать коммит в git, который заставит будущую временную метку регистрироваться в git-log?
Метки времени не имеют отношения к слияниям.





Могу я спросить, зачем вам это нужно?
Если вы не хотите менять свои часы, я бы предложил создать сценарий для выполнения фиксации и использовать планировщик Windows (или любой другой эквивалент для вашей ОС) для запуска скрипта в то время, когда вы хотите, чтобы фиксация была.
Хорошая идея. В Unix-подобных системах вы можете использовать команду "at" (см. "Man at" для использования).
Тебе стоит немного подождать.
Или вы можете сделать это:
/tmp/x 604% env GIT_AUTHOR_DATE='Wed Dec 19 15:14:05 2029 -0800' git commit -m 'future!'
[master]: created 6348548: "Future!"
1 files changed, 1 insertions(+), 0 deletions(-)
/tmp/x 605% git log
Author: Dustin Sallings <[email protected]>
Date: Wed Dec 19 15:14:05 2029 -0800
Future!
Примечание, что есть и дата автора, и дата коммиттера, поэтому обязательно установите правильную дату (или обе).
Он также работает с форматом даты ISO 8601: «2029-12-19 15:14:05 -0800». Мне нравится это.
В чем разница между GIT_AUTHOR_DATE и GIT_COMMITTER_DATE?
@Blago: В git автор (человек, написавший изменение) и коммиттер (человек, который поместил изменение в репозиторий) отслеживаются отдельно. Позволяет делать самые разные великие дела.
«Тебе стоит немного подождать». ржу не могу
Ввиду того, что назад в будущее теперь в прошлом, я действительно с нетерпением жду, что жду достаточно долго;)
Если вы хотите сохранить фактическую дату изменения при добавлении проекта в git, вы можете сделать это с помощью
env GIT_AUTHOR_DATE = "`ls -rt *.cpp|tail -1|xargs date -u -r`" git commit -m "Old sources retaining old change-dates of last changed
file: `ls -rt *.cpp|tail -1`, actual commit date: `date`"
Это будет зафиксировано с датой изменения последнего измененного файла * .cpp и приятным поясняющим сообщением о фактической дате фиксации.
Вы можете изменить фиксацию, пример с 2037 годом:
git commit --amend --date = "Wed Feb 16 14:00 2037 +0100"
Я тоже попробовал 2038 год, но потом получил значение ноль для даты.
Все до 19 января 3:14:07 2038 UTC должно работать. en.wikipedia.org/wiki/Year_2038_problem
Изменение фиксации изменяет только дату коммиттера. Git отслеживает 2 даты: дату коммита и дату автора. Дата автора останется исходной, с помощью изменения или любой другой команды git, которая редактирует коммиты (например, rebase и cherry-pick).
@Zombies неверно: git log по умолчанию показывает GIT_AUTHOR_DATE, а не GIT_COMMITTER_DATE. Вы можете проверить это с помощью git log --pretty=fuller, который показывает и то, и другое. Изменение фиксации с помощью опции --date изменяет дата автора. Внесение изменений без этой опции изменяет только дата фиксации, так как при этом повторно создается фиксация.
Единственная проблема этого элегантного решения заключается в том, что оно применяется только к последней фиксации. Нет возможности указать фиксацию старший, кроме как на конце ветви.
Объединив ответ Хьюго (1) с информацией, найденной здесь (2), и добавив немного sed, я получил следующее:
alias newest = "find . -path ./.git -prune -o -type f -exec stat -c \"%y %n\" '{}' + | sort -r | head -1 | sed s#'.*\./'##"
GIT_AUTHOR_DATE = "$(newest | xargs date -u -r)" GIT_COMMITTER_DATE = "$(newest | xargs date -u -r)" git commit -m "Old sources retaining old change-dates of last changed file: $(newest), actual commit date: $(date)"
Основное отличие состоит в том, что эта версия выполняет рекурсивный поиск, поэтому вы получаете последний файл в любом месте дерева, хотя он намеренно пропускает каталог .git.
Вы можете, конечно, захотеть опустить здесь одну из переменных даты, и я использую довольно свежую версию bash (4.2.37 (1) -release), поэтому нотация $ () может не сработать для вас (просто вместо этого замените его обратными кавычками (`)).
ваш newest | xargs date -u -r умирает на пробелах в имени файла. sed в репозитории FSF поддерживает строки с завершающим нулем, и это сделает весь конвейер безопасным, но до тех пор я бы сказал, что используйте -d \\ n при xarg'ing имен файлов. . . . find . -name .git -prune -o -type d -o -print0 | xargs -0 ls -dt | sed q короче
Если вы хотите изменить фиксацию датой «из будущего», как в этот ответ:
git commit --amend --date = "Wed Feb 16 14:00 2037 +0100"
См. совершить 1820703 (21 августа 2018 г.), автор: Деррик Столи (derrickstolee).
(Merged by Junio C Hamano -- gitster -- in commit 1392c5d, 27 Aug 2018)
commit: usetimestamp_tforauthor_date_slabThe
author_date_slabis used to store the author date of a commit when walking with the--author-dateflag in rev-list or log.
This was added as an 'unsigned long' in 81c6b38 ("log:--author-date-order", June 2013, Git 1.8.4-rc0)Since '
unsigned long' is ambiguous in its bit-ness across platforms (64-bit in Linux, 32-bit in Windows, for example), most references to the author dates incommit.cwere converted totimestamp_tin dddbad7 ("timestamp_t: a new data type for timestamps", April 2017, Git 2.14.0-rc0)However, the slab definition was missed, leading to a mismatch in the data types in Windows.
This would not reveal itself as a bug unless someone authors a commit after February 2106, but commits can store anything as their author date.
Вы пробовали сменить часы? =) Я бы подумал, что это должно работать локально, но не уверен, что произойдет, когда другие пойдут на слияние.