git log после (содержит) коммита?(с --graph) - PullRequest
0 голосов
/ 04 октября 2018

Я знал, что

  • git branch --contains <REVISION> может показывать имена всех дочерних веток, поскольку <REVISION>
  • git log --branches=<BRANCH_REGEX> может фильтровать ветви

Есть ли способ концептуально направить вывод первой команды на последнюю?т.е. git branch --contains <REVISION> | git log --branches=

Цель состоит в том, чтобы фильтровать ветви при использовании git log --decorate --graph --oneline [OTHER_OPTIONS]

Спасибо ~

1 Ответ

0 голосов
/ 04 октября 2018

Есть ли способ концептуально направить вывод [одной] команды [в качестве аргументов для другой]?

Оболочка (sh или bash или любой другой интерпретатор команд оболочки)Вы используете), как правило, есть способ сделать это.

Есть два распространенных написания: одно с использованием обратных цитат, что удобно для очень коротких предметов, и другое с использованием $(...), что лучше в целом, потому что оно правильно вкладывается.

Проблема с git branch --contains заключается в том, что он неправильно форматирует свои выходные данные: он напечатает *, если одно из печатаемых им имен ветвей, содержащее данный коммит, является текущей веткой.Вы должны либо сделать что-то, чтобы удалить звездочку, либо использовать более ориентированную на команду команду.Последнее в целом лучше, но требует, чтобы ваш Git не был слишком старым (2.6 или новее): замените git branch --contains <rev> на git for-each-ref --contains=<rev> --format='%(refname)' ref/heads.

Теперь вы не можете превратить это в набор шаблонов глобуса.для --branches= для git log, но вам не нужно , потому что все, что --branches=<glob> делает, это говорит git log начинать со ссылок, которые соответствуют refs/heads/<glob> и git for-each-refуже собираюсь составить полный список таких ссылок.Так что все, что вам нужно сделать, это передать этот полный список ссылок на git log.

Поскольку оболочки также расширяют $name как переменную, содержащую некоторое имя, я буду использовать это ниже вместо <...>, что иначе неоднозначно (это может означать буквальный знак «меньше» и т. д.).Это дает:

git log $log_args $(git for-each-ref --contains=$rev --format='%(refname)')

Если ваш git for-each-ref слишком стар для обработки --contains, вы должны использовать git branch --contains и убрать первые два столбца, например:

git log $log_args $(git branch --contains $rev | cut -c3-)

Это имеет недостаток, потому что git branch не добавляет префиксы к именам ветвей refs/heads.Если у вас есть ветвь с именем xyzzy и , тег также с именем xyzzy, git branch знает, как использовать имя branch и --branches=xyzzyбудет знать, что вместо ветки 1055 * будет использоваться branch , но только присвоение имени xyzzy в командной строке даст вам метку, поскольку в общем случае метки имеют более высокий приоритет, чем ветки.(См. документацию gitrevisions , в которой перечислены шесть шагов, предпринятых для разрешения имени: попробуйте в качестве тега это шаг 3, а попробуйте в качестве ветви шаг 4. Тег имеет более высокий приоритет.) Чтобы это исправить - чтобы избежать этого xkcd - вам нужно придумать его еще немного: например,

git log $log_args $(git branch --contains $rev | cut -c3- | sed s,^,refs/heads,)

.(И, конечно, см. Также этот xkcd .)

...