Не слід використовувати гіт git при написанні сценаріїв. Git забезпечує "сантехнічний" інтерфейс, який явно розроблений для використання в сценаріях (багато поточних та історичних реалізацій звичайних команд Git (додавання, оформлення замовлення, об'єднання тощо) використовують цей самий інтерфейс).
Команда сантехніка, яку ви хочете, - це git for-every-ref :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
Примітка: Вам не потрібен remotes/
префікс на пульті реф , якщо у вас немає інших рефов , що причина , origin/master
щоб відповідати кілька місць в пошук по імені вих шляху (див «Символічне ім'я реф ....» У ревізіях розділі мерзотника-Rev-синтаксичного аналізу Завдання (1) ). Якщо ви намагаєтеся Явно уникнути двозначності, то йти з повним ім'ям вих: refs/remotes/origin/master
.
Ви отримаєте вихід таким чином:
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
Ви можете передати цей вихід у ш .
Якщо вам не подобається ідея генерування коду оболонки, ви можете відмовитися від надійності * і зробити це:
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* Імена Ref повинні бути захищені від розбиття слова оболонки (див. Git-check-ref-format (1) ). Особисто я б дотримувався колишньої версії (згенерований код оболонки); Я впевненіший, що нічого невідповідного з цим не може статися.
Оскільки ви вказали bash і він підтримує масиви, ви можете підтримувати безпеку і все-таки уникати генерації кишок вашого циклу:
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
Можна зробити щось подібне, $@
якщо ви не використовуєте оболонку, яка підтримує масиви ( set --
для ініціалізації та set -- "$@" %(refname)
додавання елементів).