Как заставить git показывать коммиты в указанном диапазоне дат для даты автора?

По-видимому, это:

git log --all --after="<date> 00:00" --before="<date> 23:59" --author="<author>"

фильтрует фиксации на основе даты фиксации. Как я могу показать коммиты для указанного диапазона дат автора?


person Mr_and_Mrs_D    schedule 18.05.2016    source источник
comment
Возможный дубликат Git log: фильтровать по дате автора фиксации   -  person underscore_d    schedule 11.02.2018


Ответы (4)


Вы не можете — по крайней мере, не только в 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 для получения дополнительной информации.

person torek    schedule 18.05.2016
comment
Спасибо за ваш авторитет, проясняющий для меня путаницу - это давно беспокоило меня, и я потратил много времени на просмотр справочных страниц, чтобы попытаться найти несуществующий переключатель. Есть ли уже открытая ошибка для этого? - person Mr_and_Mrs_D; 19.05.2016
comment
Я не знаю, считают ли ребята из Git это ошибкой. Ссылки на списки рассылки см. на странице github.com/git/git. - person torek; 19.05.2016
comment
Спасибо за этот ответ. Я также пробовал разные способы и отлаживал, но у меня не работало. - person Deep Dalsania; 13.06.2021

Может быть, я что-то упускаю, но разве этого недостаточно?

git log --pretty=format:"%ad - %an: %s" --after="2016-01-31" --until="2017-03-10" --author="John Doe"

См. также здесь

person jackdbd    schedule 14.03.2017
comment
@RossSolomon: показывает дату автора, но выбирает по дате коммиттера. В качестве крайнего примера предположим, что я делаю фиксацию с датой автора, установленной на 1999, и датой фиксации, установленной на 01-01-2017. Директива %ad покажет вам этот коммит, созданный в 1999 году, хотя он был создан задолго до 2016 года! - person torek; 09.10.2017
comment
Эта команда не работает с форматом даты iso-8601 в --before и --after. У меня работает формат dd-mm-ccyy. - person hktegner; 04.05.2018
comment
Понижение, потому что этот ответ не отвечает на вопрос, несмотря на то, что в целом он полезен. - person ravron; 25.06.2018
comment
Даже если он не отвечает на вопрос, если я случайно наткнулся на этот ответ и нашел решение моей похожей, но не такой же проблемы, я проголосую за ответ, простой как что. Однако это не означает, что ответ должен быть принят, и я понимаю, что кто-то его отрицает. - person Mefitico; 18.01.2019
comment
Мне нравится добавлять --reverse, чтобы отсортировать их от самого старого к самому новому. - person sicko; 02.10.2020

Вы можете.

Но, как упомянул @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 указывает имя автора.

person Tim Biegeleisen    schedule 18.05.2016
comment
Спасибо - я пошел дальше и принял ответ Торека как более полный, но проголосовал за ваш за отправную точку :) - person Mr_and_Mrs_D; 19.05.2016
comment
Проблема этого подхода в том, что он работает только с однострочными выводами. С log -p, например, так не пойдет. - person Sergei Tachenov; 10.07.2021
comment
@SergeiTachenov Спасибо за комментарий, и я бы посоветовал не переезжать в Хьюстон. НАСА и США уже прошли свой пик, и славные дни эры Аполлона, вероятно, не вернутся. - person Tim Biegeleisen; 10.07.2021
comment
@TimBiegeleisen, ха-ха! Не похоже, чтобы у меня были какие-то шансы действительно переехать туда! И по сравнению с российской космической отраслью, в которой я работаю, всё действительно ультрасовременно. - person Sergei Tachenov; 11.07.2021
comment
Честно говоря, может быть, взглянуть на китайское космическое агентство. Они только что запустили космическую станцию, плюс Китай находится всего в нескольких минутах полета на самолете от России. - person Tim Biegeleisen; 11.07.2021

вдохновленный ответом Тима Бигелейзена выше.

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, чтобы получить gitsha

person Mathieu J.    schedule 25.06.2020
comment
%x08 в красивом формате означает ascii 08, который является пробелом, поэтому он съедает последнюю цифру предыдущего %ad, который является датой автора в формате ISO, поэтому я использую этот вариант (также добавлено двоеточие после имени автора): git log --all --date=iso --pretty=format:'%ad - %aN : %s' | grep 2020-09 | sort -u - person sicko; 02.10.2020