Вывод команды git, прочитанной через сценарий оболочки, добавляет специальные символы при повторной передаче другой команде git

У меня есть требование удалить ветки в репозитории git разработчика, который недавно покинул организацию. Поэтому я использовал git for-each-ref, чтобы перечислить все ветки, затем использовал grep для фильтрации результатов по имени разработчика (test_developer в следующем скрипте). Я использовал shell read и извлеченную ветку в переменную mybr и использовал git push origin --delete для удаления ветки. Пожалуйста, найдите фрагмент кода ниже:

git for-each-ref --format='%(align:1,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=authorname refs/remotes | grep test_developer | while read line;do mystr=(${line}); mybr=${mystr[1]}; git push origin --delete "$mybr"; done

Проблема выводится как «фатальный: удаленная часть refspec не является допустимым именем в:? [Mbugfix / CRIP-2475». Здесь bugfix / CRIP-2475 - это название ветки. И мне интересно, что это за дополнительные символы:? [M, которые были добавлены перед именем ветки.

Если я сделаю echo $ mybr перед git delete, я правильно напечатаю значение как «bugfix / CRIP-2475». И если я передам это значение вручную в git delete, он будет работать нормально. Но когда он передается как переменная, я получаю указанную выше ошибку. Я подозреваю, что добавляются некоторые специальные символы, может быть символ ctrlM или что-то, что эхо не выводится на экран.

Есть ли способ удалить эти лишние символы?

Основная причина этой проблемы - использование цветов. Пожалуйста, посмотрите на решение доктора философии для определения первопричины.

Anil kumar 13.04.2018 10:05
0
1
146
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Да, вы можете удалить с помощью Замена подстроки в Bash

${str/#find/replace} для замены символов предварительной фиксации

${str/%find/replace} для замены символов после исправления

git for-each-ref --format='%(align:1,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=authorname refs/remotes | grep test_developer | while read line;do mystr=(${line}); mybr=${mystr[1]}; git push origin --delete "${mybr/#?[m/}"; done

Эти «волшебные» символы, конечно же, цвета. Вы не должны использовать цвета в трубках:

git for-each-ref --format='%(align:1,left)%(authorname)%(end) %(refname:strip=3)' --sort=authorname refs/remotes | …

Спасибо за вклад. Вы устранили основную причину этой проблемы.

Anil kumar 13.04.2018 10:04

Другие вопросы по теме