Использование 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 правильный, но я не понимаю, почему это не работает

  • Получите дополнение к результату команды ls
  • Почему xargs пропускает первый аргумент при передаче в подоболочку?
  • использование xargs для grep нескольких шаблонов
  • Удаление некоторых из самых больших файлов в каталоге
  • xargs и линейный трубопровод
  • Использовать xargs вместо псевдонимов
  • Формат вывода xargs
  • Передача нескольких аргументов в середине команды с помощью xargs
  • 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], вы можете использовать его с разделителем строк по умолчанию

    Linux и Unix - лучшая ОС в мире.