По умолчанию git rebase установит метку времени коммиттера на время, когда
Новый коммит создан, но сохраните временную метку автора. Большая часть времени,
это желаемое поведение, но в некоторых случаях мы не хотим менять
метка времени коммитера тоже. Как мы можем сделать это? Ну вот
трюк, который я обычно делаю.
Во-первых, убедитесь, что каждый коммит, который вы собираетесь перебазировать, имеет уникальный
сообщение о фиксации и отметка времени автора (здесь уловка нуждается в улучшении, хотя в настоящее время она соответствует моим потребностям).
Перед перебазированием запишите метку времени коммиттера, метку автора и сообщение о коммите всех коммитов, которые будут перебазированы в файл.
#NOTE: BASE is the commit where your rebase begins
git log --pretty='%ct %at %s' BASE..HEAD > hashlog
Тогда позвольте фактической перезагрузке иметь место.
Наконец, мы заменяем метку времени текущего коммиттера на метку, записанную в файле, если сообщение фиксации совпадает с использованием git filter-branch
.
git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%at %s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_COMMITTER_DATE=$__date || cat'
Если что-то пойдет не так, просто оформите git reflog
или все refs/original/
ссылки.
Furthormore, вы можете сделать то же самое, что и временная метка автора.
Например, если временная метка автора некоторых коммитов вышла из строя, и
без изменения этих коммитов, мы просто хотим, чтобы метка времени автора отображалась в
порядок, тогда помогут следующие команды.
git log --pretty='%at %s' COMMIT1..COMMIT2 > hashlog
join -1 1 -2 1 <(cat hashlog | cut -f 1 | sort -nr | awk '{ print NR" "$1 }') <(cat hashlog | awk '{ print NR" "$0 }') | cut -d" " -f2,4- > hashlog_
mv hashlog_ hashlog
git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_AUTHOR_DATE=$__date || cat'