Используя xargs с мерзавцем

Удар Ctrl-C (или безотносительно тока intr символ находится в выводе stty -a) в терминале, если isig появляется в выводе stty -a заставляет ядро отправлять a SIGINT предупредите к каждому процессу в группе приоритетного процесса терминала, который является заданием оболочки, работающим на переднем плане, если Вы выполняете интерактивную оболочку в том терминале.

По умолчанию тот сигнал заставляет процесс немедленно умереть (не сбрасывая буферы или любое действие очистки). Однако приложения являются бесплатными прервать или проигнорировать тот сигнал и работать безотносительно действия, которое они считают необходимыми перед выходом.

Диспетчер пакетов обычно делал бы так, поскольку он постарается не оставлять систему пакета в непоследовательном состоянии. Однако все диспетчеры пакетов вели бы себя по-другому, таким образом, необходимо будет указать, который Вы используете.

3
09.07.2014, 14:08
2 ответа

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

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

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


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

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

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

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

.
4
27.01.2020, 21:19
  • Я создал тег git для каждого слияния с каналом и сxargs:
    • git log --oneline --merges --pretty=format:"V%ad %H" --date=format:"%Y%m%d_%H_%M" |xargs -n2 git tag --force

ИЛИ

  • Я создал тег git для каждого слияния с каналом и с awkвместоxargs:

    • git log --oneline --merges --pretty=format:"V%ad %H" --date=format:"%Y%m%d_%H_%M" | awk '{system("git tag --force " $1 " " $2)}'

ИЛИ

  • с помощью xargs и bash

    • git log --oneline --merges --pretty=format:"V%ad %H" --date=format:"%Y%m%d_%H_%M" | xargs -l bash -c 'git tag $0 $1 --force'

ИЛИ

  • Другое с темой в названии тега
    • git log --oneline --merges --pretty=format:"V%ad_%f %H" --date=format:"%Y%m%d_%H_%M" | sed "s/\./_/g" | xargs -l bash -c 'var="$0" && git tag --force ${var:0:100} $1'

и после:git push --tags origin mytargetbranch

Информация

Альтернатива git log --oneline --merges --pretty=format:"V%ad_%f %H", где%f(очищенный субъект )заменяется на %sи perl очищается для принятия расширенного латинского алфавита

git log --oneline --merges --pretty=format:"V%ad_%s+++%H" --date=format:"%Y%m%d_%H_%M"| perl -pe 's/[\?\[\]\/\\=<>:;,\x27"&\$#*()|~`!{}%]//g;' |   sed "s/[.]/_/g" |   sed "s/+++/ /g"  |   sed "s/+//g" | xargs  -l bash -c 'var="$0";git tag --force  ${var:0:100} $1' && git push --tags origin mytargetbranch

Информация

0
05.03.2021, 15:05

Теги

Похожие вопросы