Например, по заданному имени ветки удаленного отслеживания Git upstream/develop
как узнать, какая локальная ветка ее отслеживает, если есть?
Если возможно, я ищу решение, которое не зависит от сценариев оболочки, а также работает в Windows.
Основываясь на этом ответе (перечисление веток) и этом ответе (извлечение вышестоящей ветки), вы можете выполнить итерацию по локальным веткам и проверить, есть ли у какой-либо из них желаемая отслеживающая удаленная ветка:
git for-each-ref --shell \
--format='test %(upstream:short) = "upstream/develop" && echo %(refname:short)' \
refs/heads/ | sh
@RomainValeri Из [справочной страницы} (git-scm.com/docs/git-for-each-ref#Documentation/…), --shell
только делает замену (%(whatever)
) правильно заключенной в кавычки для прямой оценки, но делает не вызывать оболочку сам по себе. То же самое верно для --perl
, --python
и --tcl
.
Спасибо за отзыв, теперь мне стало понятнее ^^ Раньше никогда не пользовался этой опцией
Альтернативой является использование условного формата с for-each-ref
.
git for-each-ref --format = "%(if:equals=upstream/develop)%(upstream:short)%(then)%(refname:short)%(end)" refs/heads | sort -u
который можно было бы более удобно поместить в псевдоним, например
git config --global alias.who-tracks '!f() { git for-each-ref --format = "%(if:equals=upstream/$1)%(upstream:short)%(then)%(refname:short)%(end)" refs/heads | sort -u; }; f'
# then when you need it :
git who-tracks develop
git who-tracks another/branch
В этом псевдониме я предположил уникальный пульт, но, конечно, если вы хотите иметь возможность использовать его на разных пультах, немного настройте, чтобы включить имя пульта в параметр:
git config --global alias.who-tracks '!f() { git for-each-ref --format = "%(if:equals=$1)%(upstream:short)%(then)%(refname:short)%(end)" refs/heads | sort -u; }; f'
# then when you need it :
git who-tracks upstream/develop
git who-tracks origin/another/branch
Я не думаю, что вам действительно нужен здесь sort -u
, и его удаление, вероятно, поможет в Windows (не то чтобы я использую Windows, поэтому я точно не знаю :-)).
@torek Правда, но когда я пробовал без него, пустые строки выглядели неэстетично и громоздко. Я думаю, это вариант ^^
Другой альтернативой является фильтрация очень подробного вывода простого git branch
с помощью grep
git branch -vv | grep upstream/develop
Мой вариант использования заключался в том, чтобы найти удаленный и ветку, которые независимый восходящий поток использовал для своей копии моей ветки, на основе частичного имени для этой ветки («po/glos..»). Команда git branch -rl | grep po/glos
была универсальным решением для ее поиска на основе вашего примера!
Почему
--shell
и| sh
?