Как заставить git показывать коммиты в указанном диапазоне дат для даты автора?
Видимо это:
git log --all --after="<date> 00:00" --before="<date> 23:59" --author="<author>"
фильтрует коммиты на основе даты коммиттера. Как я могу сделать так, чтобы он показывал коммиты для указанного диапазона дат автора?
5 ответов
Вы не можете - по крайней мере, не только в Git. (Напоминание другим посетителям этого вопроса: речь идет не о просмотре даты автора, а о выборе коммитов по дате автора, а-ля --since
/ --after
а также --until
/ --before
, Эти селекторы используют дату коммиттера, а не дату автора. Рассмотрим в качестве крайнего примера коммит, сделанный "сейчас", так что его дата коммиттера указана в 2000-х годах, но задним числом в поле "дата автора" является какой-то день в 1999 году. Если ваш диапазон выбора равен "в любое время на рубеже век "вы отмените выбор этого коммита, поскольку дата его коммитера" сейчас ", более чем десятилетие после 1999 года.)
Я считаю, что это небольшая ошибка в Git: вы должны иметь возможность запрашивать, чтобы он использовал поле даты автора везде, где вы можете запросить, чтобы он использовал поле даты коммиттера. Это легко с форматированием журнала, так как у нас есть %ad
а также %cd
и тому подобное, но невозможно с фиксацией выбора. Наиболее близким у нас является то, что git rev-list
можно сортировать по дате автора (в рамках общей топосортировки).
Глобальный переключатель в git rev-list
, лайк --use-author-date
, будет работать как простой патч, и не будет слишком сложно добавить в Git, но я думаю, что было бы лучше иметь --min-author-age
а также --max-author-age
или аналогичный, и флаг "сортировать по дате автора" (независимо от общего --topo-order
флаг, так что установка обоих флагов имеет тот же эффект, что и --author-date-order
).
В качестве обходного пути вы можете перечислить все потенциально интересные коммиты (с git rev-list
или эквивалентный, такой как git log
: используйте любой спецификатор, который делает коммиты потенциально интересными, за исключением фильтров даты: в данном случае это просто --all
) и извлеките все их поля даты автора (с git log --format=%at
или что-то еще), затем выполните собственное сокращение списка идентификаторов фиксации, а затем повторно отправьте оставшиеся идентификаторы фиксации в git log --no-walk
, Но это больно в лучшем случае. Посмотрите ответ Тима Байгелейзена, используя awk для большего.
Может быть, я что-то упускаю, но этого будет недостаточно?
git log --pretty=format:"%ad - %an: %s" --after="2016-01-31" --until="2017-03-10" --author="John Doe"
Смотрите также здесь
Вы можете
Но, как упоминал @torek, вы не сможете сделать это с помощью чистого Git. Одним из вариантов будет передача какого-нибудь симпатичного формата из git log
в awk
и проверьте дату автора там:
git log --date=iso --pretty=format:'%ad%x08%aN' | awk '$0 >= "2013-01-01" && $0 <= "2013-12-01"'
Здесь %ad
дает дату автора в формате ISO, и %aN
дает имя автора.
Для тех, кто ищет быстрое решение для копирования и вставки:
git log --pretty=format:'%ai %H' | \
awk '$0 >= "<after-date>" && $0 <= "<before-date>" && !a[$3]++' | \
cut -d' ' -f 4 | git log --no-walk --stdin
Обратите внимание, что
<after-date>
или
<before-date>
порции можно останавливать по мере необходимости, и
&& !a[$3]++
требуется только при использовании
git log
пометить как
-g
который может повторять коммиты.
На основании этого ответа по torek , который также способствовали в Mr_and_Mrs_D и Tim Biegeleisen (все участник по этому вопросу).
Вдохновленный ответом Тима Бигелейзена выше.
git log --all --date=iso --pretty=format:'%ad%x08%aN %s' | grep 2020-06-09 | sort -u
сделал то, что мне нужно. Мне нужна дата автора, а не дата коммитов, потому что я много перебазирую и раздавливаю. но я сохраняю важные даты при импорте.
В связи с этим у меня есть небольшой помощник, позволяющий мне сбросить адрес электронной почты автора, но сохранить дату исходного автора. --reset-author по умолчанию перезаписывает дату автора.
https://github.com/mathieujobin/git-scripts/blob/master/bin/git-reset-author-but-not-date
в журнале git выше, при необходимости, вы можете добавить %H
получить гитшу