Frage Wie kann ich feststellen, welcher lokale Zweig in welchem ​​Zweig den entfernten Zweig verfolgt?


Ich würde gerne wissen, ob es eine Möglichkeit gibt zu sagen, welcher lokale Zweig in welchem ​​Zweig den entfernten Zweig verfolgt.

Ich benutze einen Remote-Server, der "Herkunft" genannt wird.


231
2017-08-27 01:04


Ursprung


Korrigieren Sie mich, wenn ich falsch liege, aber ist es nicht ein Remote-Zweig, der standardmäßig den Ursprung genannt wird, anstatt den Server? - Chris Halcrow


Antworten:


Am Beispiel meiner Kopie von Puppet, die aus dem vorgeschalteten Git-Repository auf Github.com ausgecheckt wurde ...

$ git remote show origin
* remote origin
  Fetch URL: git://github.com/reductivelabs/puppet.git
  Push  URL: git://github.com/reductivelabs/puppet.git
  HEAD branch: master
  Remote branches:
    0.24.x                 tracked
    0.25.x                 tracked
    2.6.x                  tracked
    master                 tracked
    next                   tracked
    primordial-ooze        tracked
    reins-on-a-horse       tracked
    testing                tracked
    testing-17-march       tracked
    testing-18-march       tracked
    testing-2-april        tracked
    testing-2-april-midday tracked
    testing-20-march       tracked
    testing-21-march       tracked
    testing-24-march       tracked
    testing-26-march       tracked
    testing-29-march       tracked
    testing-31-march       tracked
    testing-5-april        tracked
    testing-9-april        tracked
    testing4268            tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Dann wenn ich folgendes ausführen würde:

$ git checkout -b local_2.6 -t origin/2.6.x 
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'

Und schließlich die git remote show origin befehle ich das Folgende wieder unten:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master

197
2017-08-27 03:03



Das bedeutet, dass Sie alle entfernten Zweige in der Puppe verfolgen können, obwohl Sie ein paar lokale Zweige haben. Was bedeuten die vielen "verfolgten" Zeichen, die Sie im Ergebnis des Befehls sehen? "verfolgt" durch welche lokale Niederlassung? - PJ.
Die Remote-Zweige werden darin verfolgt, wenn Sie ein tun git fetch oder git pull Aktualisierungen an den Remote-Zweigstellen werden in Ihrem geklonten Repository verfolgt. Die lokalen Zweige sind genau das, lokale Zweige der entfernten Zweige und somit werden Aktualisierungen zu den entfernten Zweigen verfolgt und zusammengeführt, wenn der entsprechende Befehl dazu gegeben wird. Ich schließe explizit die Option "-t" ein, wenn ich den lokalen Zweig mache, um sicherzustellen, dass er den Zweig verfolgt, von dem er stammt. Denken Sie daran, dass eine lokale Niederlassung auch eine andere lokale Niederlassung verfolgen kann, so dass sie keine entfernte Niederlassung sein muss. - Jeremy Bouse
@ PJ: Der Begriff "Spur" hat zwei unterschiedliche Bedeutungen in Git. Die "verfolgten" Linien in git remote show remote-name beziehen auf "Nachverfolgungszweige" (Snapshots von Zweigen aus Remote-Repositories). Die Zeilen "merges with" beziehen sich auf lokale Zweige mit einem "Vorgelagerter Zweig" Konfiguration (gemacht mit dem --track/-t Option von Git Zweig oder Git Kasse und daher oft mit "Verfolgungsästen" verwechselt). - Chris Johnsen
"Remote-Tracking-Zweig"ist der aktuelle Glossareintrag für" Tracking-Zweige ", der oben erwähnt wurde. Das Dokument wurde in aktualisiert 8b3f3f84. - ento


Für alle Branchen:

git branch -avv

Nur für lokale Filialen:

git branch -lvv

Nur für Remote-Zweigstellen:

git branch -rvv

zeigt Ihnen alle Zweige sowie den Namen der vorgelagerten Verzweigung.


122
2018-02-14 16:02



Dies ist bei weitem die einfachste und vollste Antwort!
Auf Git Version 1.7.7.5 zeigt dies mir den lokalen Zweig und den sha-1, auf den es zeigt, aber es zeigt nicht den verfolgten entfernten Zweig ... - mpontillo
Funktioniert für mich auf Git Version 1.7.4.1 Das zweite 'v' wird benötigt, um den Remote-Tracking-Zweig anzuzeigen. - Peter Johnson
um die Leistung zu reduzieren git branch -lvv Zeige nur lokale Zweige mit Upstream könnte nützlich sein - A B
^git branch -vv funktioniert bei mir... - notacouch


Jeremy Bouse zeigt es Wie git remote show zeigt Verfolgungsinformationen an. Das sollte ausreichen, wenn Sie nur die Informationen für den menschlichen Verzehr haben wollen.

Wenn Sie die Informationen in einem automatisierten Kontext (z. B. einem Skript) verwenden möchten, sollten Sie die untergeordnete Ebene ("plumbing") verwenden. git for-each-ref stattdessen.

% git remote show origin
* remote origin
⋮
  Local branches configured for 'git pull':
    master merges with remote master
    pu     merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu

Das git for-each-ref lernte das %(upstream) Token ein Git 1.6.3. Bei früheren Versionen von Git müssen Sie die Tracking-Informationen mit extrahieren git config branch.<name>.remote und git config branch.<name>.merge (wahrscheinlich mit git for-each-ref um die Befehle für jeden lokalen Zweignamen zu erstellen).


52
2017-08-27 03:18



Ihre Antworten sind viel prägnanter und einfacher zu verstehen. - CubanX
Um es weniger prägnant zu machen, aber eine gute Möglichkeit zu bieten, visuell zu überprüfen, dass entfernte Namen mit den lokalen Verzweigungsnamen identisch sind, ein gängiges git gotcha: in bash git for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n' - hobs


Für eine bestimmte Branche können Sie verwenden git rev-parse mit dem @{u} oder @{upstream} Suffix für den Zweignamen, z. B .:

$  git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master

... oder für die Kurzform hinzufügen --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master

Du kannst generell die branch@{upstream} Syntax überall dort, wo ein Commit erwartet wird.


18
2018-05-01 09:18



+1 Ihre Antwort gab mir genau das, was ich brauchte: git rev-parse --symbolic-full-name HEAD gegen git rev-parse --symbolic-full-name HEAD@{u}, Vielen Dank! - Tino


Ich benutze das folgende Shell-Skript (benannt git-tracks) um den entfernten Zweig anzuzeigen, der vom aktuellen Zweig verfolgt wird:

#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}

echo "${remote:?}/${remoteBranch:?}"

Dies könnte auch das erwähnte verwenden git for-each-ref, aber ich fand den direkten Zugriff etwas einfacher als das Filtern der Ausgabe für den aktuellen Zweig.


10
2018-01-21 14:26



Sie könnten "set -e" am Anfang des Skripts verwenden. Dadurch können Sie alle Instanzen von "|| exit $?" Entfernen. unter Beibehaltung desselben fehlgeschlagenen Verhaltens. - John Whitley
@JohnWhitley: Danke, ich habe meine Antwort bearbeitet. ich weiss Bescheid set -e, aber normalerweise bleiben Sie bei der expliziten Überprüfung. Aber in diesem Fall ist es wirklich besser. - Ingo Karkat
Arbeitet nicht für mich git version 1.9.4. Echos nichts :( - Ain


.git/config Datei liefert auch die Tracking-Zweig-Informationen als

[remote "Hub"]
    url = ssh://xxxx/tmp/Hub
    fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
    remote = Hub
    merge = refs/heads/develop
[branch "Dev1"]
    remote = Test
    merge = refs/heads/Dev1
[remote "Test"]
    url = ssh://xxxx/tmp/gittesting/Dev1GIT
    fetch = +refs/heads/*:refs/remotes/Test/*

8
2017-10-11 12:59





git branch -vv

zeigt genau, wonach Sie fragen. Es zeigt die lokalen Zweige zusammen mit dem entsprechenden entfernten Zweig an, den sie verfolgen.


5
2018-05-07 07:50





Fügen Sie diese Runen dem hinzu [alias] Abschnitt Ihrer .gitconfig-Datei:

show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'

2
2018-03-07 16:48





Ich musste die entsprechende Remote-Verzweigung (falls vorhanden) für jede lokale Verzweigung innerhalb einer Schleife finden, die auf einer Liste der lokalen Verzweigungen agierte. Ich habe am Ende folgendes benutzt:

git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"

Dies wird nichts (eine leere Zeichenkette) für lokale Zweige ausgeben, die keine entsprechende entfernte Verzweigung ("someremote / somebranch") haben.


0
2017-11-23 00:08