Есть ли способ концептуально направить вывод [одной] команды [в качестве аргументов для другой]?
Оболочка (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 .)