При написании скриптов не следует использовать ветку git . Git предоставляет «сантехнический» интерфейс который явно предназначен для использования в сценариях (многие текущие и исторические реализации обычных команд Git (добавление, проверка, слияние и т. Д.) Используют этот же интерфейс).
Вам нужна команда сантехники git for-each-ref :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
Примечание. remotes/
Префикс удаленной ссылки не нужен, если только у вас нет других ссылок, которые приводят origin/master
к совпадению нескольких мест в пути поиска имени ссылки (см. «Символьное имя ссылки…» в разделе «Указание редакций» в git-rev-parse (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
Вы можете направить этот вывод в sh .
Если вам не нравится идея генерации кода оболочки, вы можете отказаться от некоторой надежности * и сделать следующее:
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* Имена ссылок должны быть защищены от разделения слов оболочки (см. 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)
добавления элементов).