Як отримати git для відображення комітів у вказаному діапазоні дат для автора?


86

Мабуть, це :

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

фільтрує коміти на основі дати комітера . Як я можу змусити його відображати коміти за вказаний діапазон дат автора?


Можливий дублікат журналу Git: відфільтрувати за датою автора
underscore_d

Відповіді:


41

Ви не можете - принаймні, не лише в 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: use what specifier робить коміти потенційно цікавими, за винятком фільтрів дати: у цьому випадку це просто --all) і витягти всі їхні поля дати автора (з git log --format=%atабо що завгодно), то виконайте власне обрізання списку ідентифікаторів комітів, а потім повторно надішліть інші ідентифікатори комітів git log --no-walk. Але це в кращому випадку болісно. Дивіться відповідь Тіма Бейглейзена, використовуючи awk, щоб дізнатися більше.


1
Дякую за ваш авторитет, який усуває для мене плутанину - це мене давно хвилює, і я витратив багато часу, переглядаючи сторінки з інструкціями, щоб спробувати знайти неіснуючий перемикач. Чи вже є помилка для цього?
Mr_and_Mrs_D

Я не знаю, чи вважають люди Git це помилкою. Посилання на списки розсилки див. На github.com/git/git .
Торек

124

Можливо, я чогось пропускаю, але чи цього не вистачить?

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

Дивіться також тут


18
@RossSolomon: показує дату автора, але вибирає за датою комітера . Взяти крайній приклад, припустимо, я роблю коміт із датою автора, встановленою на 1999 рік, і датою комітера, встановленою на 01-01-2017. %adДиректива покаже вам це авторство-в-1999 Комміт, незважаючи на те, що шлях до 2016 року!
torek

7
"Можливо, мені чогось не вистачає" Так, вся суть питання. Тут використовується точно такий же метод фільтрації, як і OP, на основі дати коміту, але просто відображається дата автора після того, як уже відфільтровано те, що вони хочуть. Як у 18 людей було таке погане розуміння читання?
underscore_d

Ця команда не працює з форматом дати iso-8601 у - до та після. Для мене працює формат "dd-mm-ccyy".
hktegner

8
Проголосування проти, оскільки ця відповідь не стосується питання, незважаючи на корисність загалом.
ravron

2
Навіть якщо це не дає відповіді на запитання, якщо я випадково натрапив на цю відповідь і знайшов рішення для моєї подібної, але не тієї ж проблеми, я підтримую відповідь, просту таку. Однак це не означає, що відповідь слід прийняти, і я розумію, хтось її голосував.
Мефітіко

31

Ви можете .

Але, як згадував @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ім’я автора.


1
Дякую - я продовжив і прийняв відповідь Торека як більш вичерпну, але підтримав вашу за точку відліку :)
Mr_and_Mrs_D

2

натхненний відповіддю Тіма Бігелейзена.

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


1
% x08 у гарному форматі означає ascii 08, який є зворотним простором, тому він з'їдає останню цифру попереднього% ad, яка є датою автора у форматі ISO, тому я використовую цей варіант (також додано двокрапку після імені автора):git log --all --date=iso --pretty=format:'%ad - %aN : %s' | grep 2020-09 | sort -u
sicko
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.