Показать только коммиты, которые являются родителями одного из моих коммитов? - PullRequest
1 голос
/ 04 июля 2019

Я работаю в большой команде, поэтому есть множество веток функций от других разработчиков, происходящих из ветки 'master'.

Я часто работаю над несколькими ветвями функций, поэтому мне нужен способ перечисления только "моих" веток:

  • начать со всех коммитов, автором которых я являюсь, возможно, сужу до последнего месяца.
  • отображать их и всех их предков независимо от автора.

Как я могу сделать это в командной строке?

Бонус: я использую Git Extensions для взаимодействия с репозиториями Git.
Его вид по умолчанию показывает весь DAG.

enter image description here

Тем не менее, он позволяет пользователю фильтровать это представление, непосредственно указывая аргументы для команды git log, поэтому я ожидаю, что решение командной строки будет переносимым и в мире графического интерфейса.

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Вы можете получить 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 является не преобразование новой строки в пробелы, а тот факт, что выходные данные замещаемой команды разделяются на отдельные аргументы.Однако с некоторыми другими командами становятся важными мелкие детали подстановки команд.

0 голосов
/ 04 июля 2019
git log --pretty="%h %p" --author=<Name> --since="1 month ago"

Каждая строка имеет один или несколько коммитов. Первый - это коммит, автором которого является вы, а возраст которого меньше 1 месяца, а остальные - его родители. При необходимости можно добавить дополнительные заполнители и слова в строку формата.

...