Дивіться також:
Як я можу побачити, які гілки Git відстежують, яку віддалену / верхню гілку?
Як я можу дізнатися, яку віддалену гілку відстежує місцева гілка?
Чи потрібно аналізувати git config
вихід, чи є команда, яка зробила б це для мене?
Дивіться також:
Як я можу побачити, які гілки Git відстежують, яку віддалену / верхню гілку?
Як я можу дізнатися, яку віддалену гілку відстежує місцева гілка?
Чи потрібно аналізувати git config
вихід, чи є команда, яка зробила б це для мене?
Відповіді:
Ось команда, яка дає всі гілки відстеження (налаштовані для 'pull'), див.
$ git branch -vv
main aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit
Ви повинні проходити SHA та будь-які повідомлення, що тривалий перегляд, здійснюючи, але це швидко вводиться, і я отримую гілки відстеження вертикально вирівняні у 3 стовпці.
Якщо вам потрібна інформація про конфігурацію "тягнути" та "натиснути" на галузь, дивіться іншу відповідь далі git remote show origin
.
Оновлення
Починаючи з версії 1.8.5 ви можете показати гілку вгору за допомогою git status
таgit status -sb
git branch -av
або git remote show origin
, що дає вам багато даних, а не лише відслідковане віддалене
git status
і git status -sb
- тому після оновлення до 1.8.5.x це питання (і відповідь) не має значення.
Два варіанти:
% 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
%(refname:short)
- це ім'я поточного номера в межах --format
.
git help revisions
(одна з маловідомих, але найкорисніших частин документа) та шукайте upstream
.
git diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
echo 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)
замінити SOMEBRANCH на ім'я гілки, або "HEAD" на поточну гілку
Я думаю, що вам git branch -av
лише підказують, у яких галузях ви є і які в них здійснюються, залишаючи вам зробити висновок про те, які віддалені гілки відстежують місцеві гілки.
git remote show origin
явно повідомляє вам, які гілки відстежують, які віддалені гілки. Ось приклад виведення із сховища з одним комітом та віддаленою гілкою під назвою abranch
:
$ git branch -av
* abranch d875bf4 initial commit
master d875bf4 initial commit
remotes/origin/HEAD -> origin/master
remotes/origin/abranch d875bf4 initial commit
remotes/origin/master d875bf4 initial commit
проти
$ git remote show origin
* remote origin
Fetch URL: /home/ageorge/tmp/d/../exrepo/
Push URL: /home/ageorge/tmp/d/../exrepo/
HEAD branch (remote HEAD is ambiguous, may be one of the following):
abranch
master
Remote branches:
abranch tracked
master tracked
Local branches configured for 'git pull':
abranch merges with remote abranch
master merges with remote master
Local refs configured for 'git push':
abranch pushes to abranch (up to date)
master pushes to master (up to date)
git remote show origin
показує локальні гілки та те, що вони відстежують як для натискання, так і для витягування.
origin
, хоча він насправді може бути будь-яким (наприклад, декількома віддаленими , з різними гілками, які відстежують гілки з різних віддалених).
Оновлення: Ну, минуло кілька років, як я опублікував це! Для моєї конкретної мети порівняння HEAD з висхідним потоком я зараз використовую @{u}
, що є ярликом, який відноситься до HEAD гілки відстеження вгору. (Див. Https://git-scm.com/docs/gitreitions#gitreitions-emltbranchnamegtupstreamemegemmasterupstreamememuem ).
Оригінальна відповідь: Я також зіткнувся з цією проблемою. Я часто використовую декілька віддалених мереж в одному сховищі, і легко забути, до якої саме вашої поточної гілки слідкувати. І іноді зручно це знати, як, наприклад, коли ви хочете переглянути місцеві комісії через git log remotename/branchname..HEAD
.
Весь цей матеріал зберігається у змінних git config, але вам не доведеться розбирати вихід конфігурації git. Якщо ви викликаєте git config з наступним іменем змінної, вона просто надрукує значення цієї змінної, не вимагаючи розбору. Зважаючи на це, ось кілька команд для отримання інформації про налаштування відстеження поточної гілки:
LOCAL_BRANCH=`git name-rev --name-only HEAD`
TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`
У моєму випадку, оскільки мені цікаво лише дізнатись ім'я мого поточного пульта, я роблю це:
git config branch.`git name-rev --name-only HEAD`.remote
git name-rev --name-only HEAD
не скаже вам, на якій галузі ви насправді перебуваєте. Для цього я щойно використавgit branch | grep '^\*' | cut -d' ' -f2
@{u}
псевдонім / ярлик, і саме це я шукав! Немає підстав порівнювати з головним відділенням, якщо ви хочете лише визначити, потрібно тягнути чи ні.
@{u}
це бомба. І це вже з 1.7.0, що означає, що якщо він не доступний в git, який хтось використовує у 2018 році, вони, ймовірно, належать до оновлення.
Це покаже вам галузь, на якій ви перебуваєте:
$ git branch -vv
Це покаже лише поточну гілку, на якій ви перебуваєте:
$ git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
наприклад:
myremote/mybranch
Ви можете дізнатися URL-адресу пульта, яку використовує поточна гілка, на якій ви перебуваєте:
$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)
наприклад:
https://github.com/someone/somerepo.git
Ви можете використовувати git checkout
, тобто "перевірити поточну гілку". Це неоперативний варіант із побічними ефектами для показу інформації відстеження, якщо вона існує, для поточної гілки.
$ git checkout
Your branch is up-to-date with 'origin/master'.
Я не знаю, чи вважається це розбіром виводу конфігурації git, але це визначить URL-адресу віддаленого пристрою, який відстежує майстер:
$ git config remote. $ (git config branch.master.remote) .url
git config branch.$(git symbolic-ref -q HEAD).remote
якщо ви просто хочете, щоб ім'я віддаленого відстежувалася з поточного branch- git config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).url
для URL.
--short
варіант, щоб він працював. Отже, для отримання віддаленої назви поточної гілки: git config branch.$(git symbolic-ref -q --short HEAD).remote
та для отримання URL-адреси віддаленого поточного відділення:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
Ще один простий спосіб - це використовувати
cat .git/config
в git repo
Тут буде вказано детальну інформацію про місцеві відділення
type .git/config
замість, cat .git/config
звичайно, звичайний командний рядок ..
Ще один метод (спасибі osse), якщо ви просто хочете знати, чи існує він:
if git rev-parse @{u} > /dev/null 2>&1
then
printf "has an upstream\n"
else
printf "has no upstream\n"
fi
git branch -vv | grep 'BRANCH_NAME'
git branch -vv
: У цій частині будуть показані всі місцеві відділення разом із їх гілкою.
grep 'BRANCH_NAME'
: Вона фільтрує поточну гілку зі списку гілок.
git branch -r -vv
перерахує всі гілки, включаючи віддалені.
Вихід з порцеляни git-status (машиночитаний) v2 виглядає так:
$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2
І щоб отримати гілку тільки вище:
$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name
Якщо у відділення немає потоку, вищевказана команда видасть порожній вихід (або не вдасться set -o pipefail
).
Якщо ви хочете знайти верхню частину потоку для будь-якої гілки (на відміну від тієї, на якій ви перебуваєте), ось невелика зміна відповіді @ cdunn2001:
git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}
Це дасть вам назву віддаленої гілки місцевої гілки з назвою YOUR_LOCAL_BRANCH_NAME
.
Ви можете спробувати це:
git remote show origin | grep "branch_name"
branch_name
потребує заміни у вашому відділенні
git remote show origin
- якщо вона називається merges
або configure
?
Я використовую цей псевдонім
git config --global alias.track '!sh -c "
if [ \$# -eq 2 ]
then
echo \"Setting tracking for branch \" \$1 \" -> \" \$2;
git branch --set-upstream \$1 \$2;
else
git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v;
fi
" -'
тоді
git track
зауважте, що сценарій також можна використовувати для налаштування відстеження.
Більше чудових псевдонімів https://github.com/orefalo/bash-profiles
Я використовую EasyGit (він же "напр.") Як супер легку обгортку поверх (або уздовж) Git. EasyGit має підкоманду "інформація", яка надає вам всіляку корисну інформацію, включаючи поточну гілку віддаленого відстеження. Ось приклад (де поточна назва гілки - "foo"):
pknotz @ s883422: (foo) ~ / робоча область / bd $ напр. інформація Всього комісій: 175 Місцеве сховище: .git Іменовані віддалені сховища: (назва -> місцезнаходження) походження -> git: //sahp7577/home/pknotz/bd.git Поточна галузь: foo Криптографічна контрольна сума (sha1sum): bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf Витягнути / натиснути сховище за замовчуванням: походження Параметри витягування та натискання за замовчуванням: відділення.foo.remote = походження відділення.foo.merge = refs / heads / aal_devel_1 Кількість учасників: 3 Кількість файлів: 28 Кількість каталогів: 20 Найбільший розмір файлу, в байтах: 32473 (pygooglechart-0.2.0 / КОПІЄННЯ) Коміти: 62
Удосконалюючи цю відповідь , я придумав такі .gitconfig
псевдоніми:
branch-name = "symbolic-ref --short HEAD"
branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
branch-remote-push = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url \"$remote\" #" # cognizant of insteadOf
branch-url-push = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #" # cognizant of pushInsteadOf
Якщо ви використовуєте Gradle,
def gitHash = new ByteArrayOutputStream()
project.exec {
commandLine 'git', 'rev-parse', '--short', 'HEAD'
standardOutput = gitHash
}
def gitBranch = new ByteArrayOutputStream()
project.exec {
def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d' -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
commandLine "bash", "-c", "${gitCmd}"
standardOutput = gitBranch
}
Наступна команда буде віддаленим початковим джерелом, на яке посилається
git віддалений -v
Щоб додати віддалений шлях,
git віддалене додати початкове ім'я path_name
git remote show origin
. Основна відповідь в іншому запитанні - це сценарій башти, обгорнутий навколо простої відповіді, яка може бути корисною для деяких. Сподіваємось, це питання не буде повністю закритим.