Использование 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], вы можете использовать его с разделителем строк по умолчанию

  • Как использовать scp с xargs?
  • Один лайнер, чтобы увидеть, вернул ли grep что-то?
  • Есть ли способ манипулировать порядком аргументов stdin при использовании xargs, так же, как awk как $ 0, $ 1, $ 2 и т. Д.?
  • Почему в этом случае использование xargs завершилось неудачей?
  • Что делает «-t» в команде mv? Пример ниже
  • Найти файлы рекурсивно, которые старше одного года и не принадлежат конкретному пользователю
  • Передавать аргумент xargs как строку в другую команду с помощью '>'?
  • Передача параметров mulitiple через xargs
  • Понимание -regex с GNU find
  • Вывод команды при передаче по другой команде
  • Печать состояния файлов, обрабатываемых при использовании find
  • Команда xargs приводит к sed:;: Нет такого файла или каталога
  • Linux и Unix - лучшая ОС в мире.