Ветвь, которая отслеживает другую ветвь, не должна отслеживать (то есть иметь восходящий поток) ветвь удаленного отслеживания. Например, местное отделение feature/zorg
может отслеживать местное отделение develop
. Единственное, что наличие вверх по течению делает для вас автоматизировать больше fetch
, merge
и rebase
(и, следовательно, pull
который только fetch
следуют одной из двух других), и даст вам больше информации при работе git branch -v
(или -vv
, и т. д.) и git status
. Конечно, они довольно значительны и, следовательно, являются причиной для установки вверх по течению.
вверх -The название другой ветви, что данная ветвь следящая-устанавливается на две части: а дистанционного, который является имя удаленного, если вверх по течению является удаленным отслеживания ветви, и филиал (имя). Если пульт установлен на .
, ветка отслеживает другую локальную ветвь.
Эти две части могут быть получены по отдельности с git config
или git config --get
(оба делают то же самое):
$ git config --get branch.master.remote
origin
$ git config --get branch.master.merge
refs/heads/master
Обратите внимание, что вторая часть не претерпела отображение (ы), указанный fetch
правилом для данный пульт:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
С этого отображением говорит, что refs/heads/*
становится refs/remotes/origin/*
, мы можем определить, что нашего имени-го e, который соответствует refs/heads/master
на удаленном origin
Фактически refs/remotes/origin/master
. (Конечно, это сопоставление довольно стандартное, и некоторое программное обеспечение может просто предположить это, но лучше всего на самом деле сделать сопоставление с использованием настроек (-ов) для remotes.origin.fetch
. Может быть более одного, следовательно, здесь --get-all
.)
Опять же, если часть remote
установлена в .
, то восходящий поток фактически является локальной ветвью, и никакое сопоставление не должно применяться к части merge
.
В сценарии оболочки, то вы могли бы сделать что-то вроде:
branch="${1:-master}"
has_upstream=true
remote="$(git config --get branch.$branch.remote)" || has_upstream=false
merge="$(git config --get branch.$branch.merge)" || has_upstream=false
if ! $has_upstream; then
echo "branch $branch has no upstream"
else
case "$remote" in
.) echo "branch $branch tracks local branch $merge";;
*) echo "branch $branch tracks $merge on $remote";;
esac
fi
Это не поможет с отображением, если вы хотите, чтобы проверить пульт слежения ветвь (возможно, конечно, нужно запустить git fetch
обновить его), но вы можете получить , что с помощью git rev-parse
:
$ git rev-parse --symbolic-full-name [email protected]{u}
refs/remotes/origin/master
Обратите внимание, что вам нужно, чтобы лишить refs/remotes/
от результата, когда это удаленного отслеживания филиала, если вы хотите использовать короткую форму. Конечно, если восходящий поток является локальным филиалом, полное имя начинается с refs/heads/
, а не refs/remotes/
. Если вы хотите, чтобы текущая ветка была направлена вверх, достаточно простого @{u}
; синтаксис name@{u}
позволяет находить имена других филиалов.
Суффикс @{u}
делает rev-parse
потерпеть неудачу, если не настроен на входе:
$ git rev-parse --symbolic-full-name [email protected]{u}
fatal: no upstream configured for branch 'target'
который предлагает еще один способ сказать, если вышестоящий сконфигурирован.
Боюсь, я не понимаю, каков должен быть желаемый результат, можете ли вы более четко перефразировать свой вопрос? –