webentwicklung-frage-antwort-db.com.de

Wie kann ich sehen, welche Git-Zweige welchen Remote-/Upstream-Zweig verfolgen?

Ich weiß, ich kann git branch --all und das zeigt mir sowohl lokale als auch entfernte Niederlassungen, aber es ist nicht so nützlich, um mir die Beziehungen zwischen ihnen zu zeigen.

Wie kann ich Zweige so auflisten, dass die lokale Filiale welche Fernbedienung verfolgt?

664
joachim

Sehr ein Porzellan-Befehl, nicht gut, wenn Sie dies für das Scripting wollen:

git branch -vv   # doubly verbose!

Beachten Sie, dass mit git 1.8.3 dieser Upstream-Zweig in blue angezeigt wird (siehe " Was ist diese Zweigverfolgung (wenn überhaupt) in git? ")


Wenn Sie eine saubere Ausgabe wünschen, lesen Sie die Antwort von arcresu. - Sie verwendet einen Befehl aus Porzellan, von dem ich glaube, dass er zu der Zeit, als ich diese Antwort ursprünglich geschrieben habe, nicht existierte, also etwas prägnanter ist und mit Zweigen arbeitet, die für Rebase konfiguriert sind einfach verschmelzen.

924
Cascabel

git remote show Origin

Ersetzen Sie "Origin" durch den Namen Ihrer Fernbedienung.

205
kubi

Wenn Sie sich die Manpage für git-rev-parse ansehen, wird die folgende Syntax beschrieben:

<branchname>@{upstream}, Z.B. [email protected]{upstream}, @{u}

Das Suffix @{upstream} an einen Zweignamen (Kurzform <branchname>@{u}) bezieht sich auf den Zweig, den der Zweig mit .__ angegeben hat. branchname wird so eingestellt, dass er auf baut. Ein fehlender Filialname wird standardmäßig verwendet zum aktuellen.

Um den Upstream des Zweigs master zu finden, würden Sie Folgendes tun:

git rev-parse --abbrev-ref [email protected]{upstream}
# => Origin/master

Um die Informationen für jeden Zweig auszudrucken, können Sie Folgendes tun:

while read branch; do
  upstream=$(git rev-parse --abbrev-ref [email protected]{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
# ...

Dies ist sauberer als das manuelle Analysieren von Refs und Config.

85
Carl Suster

Eine Alternative zu kubis Antwort ist ein Blick auf die .git/config-Datei, die die Konfiguration des lokalen Repositorys zeigt:

cat .git/config

75
Abizern

Für den Zweig current gibt es zwei gute Möglichkeiten:

% git rev-parse --abbrev-ref --symbolic-full-name @{u}
Origin/mainline

oder

% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
Origin/mainline

Diese Antwort ist auch hier auf eine etwas andere Frage, die (falsch) als Duplikat markiert wurde.

34
cdunn2001
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads

zeigt eine Zeile für jede lokale Niederlassung. Ein Tracking-Zweig sieht folgendermaßen aus:

master <- Origin/master

Ein Nicht-Tracking-Programm sieht folgendermaßen aus:

test <- 
32
Aurelien

Für den aktuellen Zweig können Sie auch git checkout (ohne einen Zweig) sagen. Dies ist ein No-Op mit Nebeneffekten, um die Tracking-Informationen für den aktuellen Zweig anzuzeigen, sofern vorhanden.

$ git checkout 
Your branch is up-to-date with 'Origin/master'.
14
Eugene Yarmash

Ich benutze diesen Alias

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'

dann

git track
6
Olivier Refalo

Basierend auf Olivier Refalos Antwort

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

Es zeigt nur lokal mit konfiguriertem Track.

Schreibe es in ein Skript namens git-track in deinen Pfad und du bekommst einen git track -Befehl

Eine ausführlichere Version auf https://github.com/albfan/git-showupstream

3
albfan

git config --get-regexp "branch\.$current_branch\.remote" 

gibt den Namen der Fernbedienung an, die verfolgt wird

git config --get-regexp "branch\.$current_branch\.merge" 

gibt den Namen des Remote-Zweigs an, der verfolgt wird. 

Sie müssen $ current_branch durch den Namen Ihres aktuellen Zweigs ersetzen. Sie können das dynamisch mit git rev-parse --abbrev-ref HEAD bekommen

Das folgende Mini-Skript kombiniert diese Dinge. Legen Sie es in eine Datei mit dem Namen git-tracking, machen Sie es ausführbar und stellen Sie sicher, dass es sich in Ihrem Pfad befindet. 

dann kannst du sagen 

$ git  tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>

beachten Sie, dass sich der Name der Remote-Zweigstelle von Ihrem lokalen Zweigstellennamen unterscheiden kann (obwohl dies normalerweise nicht der Fall ist). Zum Beispiel:

$git tracking 
xxx_xls_xslx_thing -> Origin/totally_bogus

wie Sie im Code sehen können, müssen Sie die Daten aus der git config extrahieren. Ich verwende einfach sed, um die überflüssigen Daten zu löschen.

#!/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"
1
masukomi

Hier ist ein ordentlicher und einfacher. Kann git remote -v überprüfen, der Ihnen den gesamten Ursprung und den Upstream des aktuellen Zweigs zeigt.

1
MJeremy