Использование xargs с git

Я пытаюсь практиковать, используя xargs . Я пробовал следующее, передавая SHA1 через xargs :

 $ git show SHA1 --name-only 

Я также пробовал:

 $ git log --author=jim --grep="patch" |head -n 1|cut -d ' ' -f2|xargs {} git show {} --name-only 

Он возвратил xargs: {}: No such file or directory

Итак, я перешел к следующему:

 $ git log --author=jim --grep="patch" |head -n 1|cut -d ' ' -f2|xargs -0 -I {} git show {} --name-only 

Что вернулось:

 fatal: ambiguous argument 'a1237ac27321f2daea365787664e4119b339c483': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]' 

Указанный SHA правильный, но я не понимаю, почему это не работает

One Solution collect form web for “Использование xargs с git”

xargs -0 означает использовать только нулевые байты для разделения входных записей и включать символы новой строки и другие пробелы во входе. У вас будет новая строка в конце выхода ревизии там, где head и cut останутся там, и которые будут включены в аргумент, предоставленный git . Гиту это не нравится. Я думаю, вы отредактировали новую строку из сообщения об ошибке, но на самом деле это часть сообщения и что вызывает вашу проблему.

Удаление -0 заставляет вашу команду работать для меня. Учитывая вход, который вы генерируете, поведение xargs разделенное по xargs является безопасным.

В этом случае вам действительно не нужно использовать -I {}git вполне счастлив, что в качестве последнего аргумента есть ревизия, но, полагаю, вы используете его для практики. По умолчанию xargs просто помещает аргументы в самый конец данной команды (в отличие от find -exec , который использует {} подстановку).


Тем не менее, вы тоже много работаете, с вашим cut . Git более чем способен организовать свой вывод в формате, который вы можете использовать с xargs . Используя параметр --pretty=tformat... мы можем заставить его выплевывать только хэши SHA1, по одному на строку:

 git log --author=jim --grep="patch" --pretty=tformat:'%H' 

выведет все хэши совпадающих коммитов в вашем репозитории, по одному на строку. --pretty устанавливает форматирование вывода; tformat означает поставить новую tformat в конце каждого хэша; «% H» означает хэш.

Вы можете передать это в xargs, и поскольку весь ввод «чистый» [a-f0-9], вы можете использовать его с разделителем строк по умолчанию

  • Не удалось создать большой файл tar с трубкой и xargs
  • `grep -l .. | xargs vim` генерирует предупреждение, почему?
  • xargs не генерирует правильную команду
  • Доступ к каждой строке в .txt-файле, загрузка и переименование ссылок
  • Как я могу создать файл, который я получил из stdin без xargs
  • Выполнить строки вывода команд в качестве другой команды в Linux
  • Почему xargs -I подразумевает -L 1
  • использование измененного содержимого файла в качестве аргументов
  • Как иметь очередь процессов в AIX, например, xargs с «--max-procs»?
  • Копирование папки с помощью xargs
  • Как мне перебирать строки в STDIN и запускать команду оболочки?
  • Linux и Unix - лучшая ОС в мире.