Відповіді:
Дуже сильно порцелянова команда, непогано, якщо ви хочете це для сценаріїв:
git branch -vv # doubly verbose!
Зауважте, що з git 1.8.3 ця гілка вгору за течією відображається синім кольором (див. " Що це за відстеження гілки (якщо щось таке) в git? "
Якщо ви хочете чистого результату, дивіться відповідь arcresu - він використовує фарфорову команду, на яку я не вірю, що існувала в той час, коли я спочатку писав цю відповідь, тому це трохи більш стисло і працює з гілками, налаштованими на ребазацію, а не просто злиття.
git remote show origin
Замініть "походження" будь-якою назвою вашого пульта.
git remote show
команда насправді підключається до віддаленого репо ... а значить, це не вдасться, якщо ви трапляєтесь в режимі офлайн або не можете підключитися до репо з будь-якої причини ...
git remote show -n origin
для отримання інформації навіть у режимі офлайн. З документації на git remote : "З опцією -n віддалені голови спочатку не запитуються за допомогою git ls-remote <ім'я>; використовується кешована інформація."
git remote show | xargs git remote show -n
щоб переглянути комбіновану інформацію відстеження для всіх віддалених.
Якщо ви подивитеся на сторінку чоловіка для git-rev-parse
, ви побачите, як описаний наступний синтаксис:
<branchname>@{upstream}
, наприкладmaster@{upstream}
,@{u}
Суфікс
@{upstream}
до назви гілки (коротка форма<branchname>@{u}
) відноситься до гілки, яку гілка, визначена іменем гілки, встановлюється на вершині. Відсутнє ім'я гілки за замовчуванням до поточного.
Отже, щоб знайти верхню частину гілки 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/**)
Зверніть увагу на дві зірочки в кінці шаблону глобуса.
git rev-parse --abbrev-ref HEAD@{upstream}
здається, добре працює для поточної галузі. Це також робить гарний псевдонім git.
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. Я просто використовую 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"