Удар Ctrl-C (или безотносительно тока intr
символ находится в выводе stty -a
) в терминале, если isig
появляется в выводе stty -a
заставляет ядро отправлять a SIGINT
предупредите к каждому процессу в группе приоритетного процесса терминала, который является заданием оболочки, работающим на переднем плане, если Вы выполняете интерактивную оболочку в том терминале.
По умолчанию тот сигнал заставляет процесс немедленно умереть (не сбрасывая буферы или любое действие очистки). Однако приложения являются бесплатными прервать или проигнорировать тот сигнал и работать безотносительно действия, которое они считают необходимыми перед выходом.
Диспетчер пакетов обычно делал бы так, поскольку он постарается не оставлять систему пакета в непоследовательном состоянии. Однако все диспетчеры пакетов вели бы себя по-другому, таким образом, необходимо будет указать, который Вы используете.
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], вы можете использовать его с разделением строк по умолчанию
.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
Информация
xargs
:-n2
для максимальных аргументов git tag | xargs git tag -d
git ls-remote --tags origin | sed 's/refs\/tags\///' | sed 's#\^{}##'| cut -f 2 |uniq| xargs git push --delete origin
Альтернатива 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
Информация