Вы можете получить git log
, чтобы сделать это, но вы должны сделать это в двух частях.
Первая часть состоит в том, чтобы извлечь все начальные коммиты, которые вас интересуют, для которых git log
- или его сестринской команде-сантехнике, git rev-list
- нужны обычные --since
и / или --until
для даты -range-limiting и --author
для выбора коммитов, в которых вы являетесь автором. При использовании git rev-list
вывод по умолчанию - это просто список хеш-идентификаторов выбранных коммитов.
Теперь, когда у вас есть выбранные коммиты в качестве начальных хеш-идентификаторов, вам просто нужно запустить git log
для каждого такого хеш-идентификатора. В конце концов, git log
делает:
Найдите аргументы командной строки, в которых указаны хэш-идентификаторы. Если таких аргументов нет, используйте HEAD
. Это начальные идентификаторы хеша: поместите их в очередь с приоритетами. Приоритет по умолчанию состоит в том, что более новые коммиты (более поздние метки времени коммиттера) идут в начало очереди, а более старые - позади.
Теперь, когда очередь заполнена, запустите цикл:
- Извлечь коммит из очереди.
- Показывайте его, если он не отображается из-за других аргументов (например, аргументов имени пути к файлу, которые также включают упрощение истории).
- Поместите своих родителей в очередь, если только некоторые или все не должны быть помещены в очередь из-за упрощения истории или
--first-parent
.
Этот цикл выполняется до тех пор, пока очередь не станет пустой, или пока не истечет число выставленных лимитов фиксации (из -n <em>number</em>
или эквивалентных аргументов).
Обратите внимание, что если вы начинаете с одного хеш-идентификатора коммита - например, созданного HEAD
- цикл начинается с одного коммита в очереди, который он удаляет и показывает. Если у этого коммита есть один родительский элемент, один родительский элемент попадает в очередь, которая теперь имеет длину 1, поэтому Git забирает этого одного из родителей из очереди, показывает it и помещает его parent в очередь, длина которой снова равна 1. Это повторяется до тех пор, пока очередь не станет больше (при слиянии) или пока вы не достигнете корневого коммита, и поэтому простой git log
простого репозитория с некоторыми ветвями, но без слияний, показывает только те коммиты, которые находятся в текущей ветке ( HEAD
).
Для вашего случая, однако, этот цикл - ваша вторая часть:
отображать их и всех их предков независимо от автора.
Первая часть - набор хеш-идентификаторов коммитов для помещения в очередь с приоритетами - это в точности выходные данные, которые печатает git rev-list --author='...' --since=...
.
Единственная сложность заключается в подключении того, что печатает git rev-list
(выбранные идентификаторы хеша), к команде git log
. Если вы используете Unix-подобную оболочку, такую как bash
, вы можете сделать это с помощью подстановки команд:
git log $log_args $(git rev-list $rev_list_args)
Он запускает git rev-list
(с любыми аргументами), принимает выходные данные, заменяет символы новой строки пробелами, 1 , а затем запускает git log $log_args
дополнительными аргументами, состоящими из вывода git rev-list
.
В этом приеме подстановки команд есть небольшой недостаток: у некоторых систем есть максимальное количество аргументов. Если слишком много хеш-идентификаторов фиксации напечатано git rev-list
, вы получите ошибку: Список аргументов слишком длинный. Чтобы обойти это, git log
позволяет вам указать все начальные точки как введите в git log
, используя флаг --stdin
:
git rev-list $rev_list_args | git log $log_args --stdin
Возможно, вы захотите включить --decorate
в ваш $log_args
, чтобы git log
печатал любые ветви или имена тегов, которые указывают на конкретные коммиты, когда он их показывает. (Обратите внимание, что log.decorate
контролирует, подразумевается ли --decorate
, и log.decorate
уже давно по умолчанию принимает значение auto
, поэтому вам может не потребоваться вызывать его явно, если вы не передадите свой git log
вывод или перенаправить его в файл.)
1 Важной частью здесь для Git является не преобразование новой строки в пробелы, а тот факт, что выходные данные замещаемой команды разделяются на отдельные аргументы.Однако с некоторыми другими командами становятся важными мелкие детали подстановки команд.