Ответы:
Очень фарфоровая команда, не очень хорошая, если вы хотите это для сценариев:
git branch -vv # doubly verbose!
Обратите внимание, что в git 1.8.3 эта ветвь вверх по течению отображается синим цветом (см. « Что это за отслеживание веток (если есть) в git? »)
Если вы хотите получить чистый вывод, посмотрите ответ arcresu - он использует фарфоровую команду, которая, как мне кажется, не существовала в то время, когда я изначально писал этот ответ, поэтому он немного более лаконичен и работает с ветвями, настроенными для rebase, а не просто для слияния.
git remote show origin
Замените «origin» на имя вашего пульта.
git remote show
команда фактически подключается к удаленному репо ... и, следовательно, он потерпит неудачу, если вы оказались вне сети или по какой-либо причине не можете подключиться к репо ...
git remote show -n origin
чтобы получить некоторую информацию даже в автономном режиме. Из документации по git remote : «С опцией -n удаленные заголовки сначала не запрашиваются с помощью git ls-remote <name>; вместо этого используется кэшированная информация».
git remote show | xargs git remote show -n
чтобы просмотреть объединенную информацию отслеживания для всех пультов.
Если вы посмотрите на справочную страницу git-rev-parse
, вы увидите следующий синтаксис:
<branchname>@{upstream}
напримерmaster@{upstream}
,@{u}
Суффикс
@{upstream}
к branchname (краткая форма<branchname>@{u}
) относится к ветви, над которой ветвь, указанная в branchname, установлена. Отсутствующее фирменное имя по умолчанию соответствует текущему.
Следовательно, чтобы найти восходящую ветку master
, вы должны сделать:
git rev-parse --abbrev-ref master@{upstream}
# => origin/master
Чтобы распечатать информацию для каждой ветви, вы можете сделать что-то вроде:
while read branch; do
upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
if [[ $? == 0 ]]; then
echo $branch tracks $upstream
else
echo $branch has no upstream configured
fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)
# Output:
# master tracks origin/master
# ...
Это чище, чем разбор ссылок и настроек вручную.
done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)
обратите внимание на две звездочки в конце шаблона glob.
git rev-parse --abbrev-ref HEAD@{upstream}
кажется, хорошо работает для текущей ветви. Это также делает для хорошего псевдонима мерзавца.
while
Синтаксис цикла выглядит немного странно для меня. Вы можете просто использовать тот, git for-each-ref ... | while read branch; do ...
который не нуждается в FIFO и работает в том же порядке, что и написанные команды.
git for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
Альтернатива ответу kubi - взглянуть на .git/config
файл, который показывает конфигурацию локального репозитория:
cat .git/config
git config --get-regex branch
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
покажет линию для каждого местного филиала. Отслеживающая ветка будет выглядеть так:
master <- origin/master
Не отслеживающий будет выглядеть так:
test <-
git branch -vv
. 🙏
git config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
Для текущей ветки есть два хороших варианта:
% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline
или
% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline
Этот ответ также здесь , на немного другой вопрос, который был (ошибочно) отмечен как дубликат.
git for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads
.
Для текущей ветви вы также можете сказать git checkout
(без любой ветви). Это неоперация с побочными эффектами для отображения информации об отслеживании, если она существует, для текущей ветви.
$ git checkout
Your branch is up-to-date with 'origin/master'.
git checkout .
, что не является запретом.
Я использую этот псевдоним
git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'
тогда
git track
На основании ответа Оливье Рефало
if [ $# -eq 2 ]
then
echo "Setting tracking for branch " $1 " -> " $2
git branch --set-upstream $1 $2
else
echo "-- Local --"
git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
echo "-- Remote --"
REMOTES=$(git remote -v)
if [ "$REMOTES" != '' ]
then
echo $REMOTES
fi
fi
Он показывает только локально с настроенной дорожкой.
Напишите его в сценарии git-track на вашем пути, и вы получите команду git track
Более подробная версия на https://github.com/albfan/git-showupstream
git config --get-regexp "branch\.$current_branch\.remote"
даст вам имя удаленного, который отслеживается
git config --get-regexp "branch\.$current_branch\.merge"
даст вам имя удаленной ветви, которая отслеживается.
Вам нужно заменить $ current_branch на имя вашей текущей ветки. Вы можете получить это динамически сgit rev-parse --abbrev-ref HEAD
Следующий мини-скрипт объединяет эти вещи. Вставьте его в файл с именем git-tracking
, сделайте его исполняемым и убедитесь, что он находится на вашем пути.
тогда вы можете сказать
$ git tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>
обратите внимание, что имя удаленной ветви может отличаться от имени вашей локальной ветви (хотя обычно это не так). Например:
$git tracking
xxx_xls_xslx_thing -> origin/totally_bogus
как вы можете видеть в коде, ключом к этому является извлечение данных из git config. Я просто использую sed для очистки посторонних данных.
#!/bin/sh
current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
sed -e "s/^.* //" -e "s/refs\/.*\///")
echo "$current_branch -> $remote/$remote_branch"