Jak wyświetlić listę wszystkich zdalnych gałęzi w Git 1.7+?


634

Próbowałem git branch -r, ale to tylko zdalne gałęzie, które śledziłem lokalnie. Jak znaleźć listę tych, których nie mam? (Nie ma dla mnie znaczenia, czy polecenie wyświetla wszystkie odległe gałęzie, czy tylko te, które nie są śledzone).


11
To znaczy, że został zmodyfikowany domyślny refspec tak, git fetcha git remote updatenie pobierać wszystkie branże pilota? Ponieważ w przeciwnym razie możesz po prostu pobrać, a następnie użyć git branch -r...
Cascabel,

2
Muszę mieć. git branch -rpokazywał mi tylko odległe gałęzie, które śledziłem lokalnie. Teraz działa lepiej.
James A. Rosen,

Odpowiedzi:


804

Dla zdecydowanej większości [1] odwiedzających tutaj poprawna i najprostsza odpowiedź na pytanie „Jak wyświetlić listę wszystkich zdalnych oddziałów w Git 1.7+?” jest:

git branch -r

Dla niewielkiej mniejszości [1] git branch -r nie działa. Jeśli git branch -rnie działa, spróbuj:

git ls-remote --heads <remote-name>

Jeśli git branch -rnie działa, to może jako Kaskabel mówi „masz zmodyfikowany domyślny refspec tak, git fetcha git remote updatenie pobierać wszystkie remote„s oddziały” .


[1] W momencie pisania tego przypisu 2018-luty spojrzałem na komentarze i zobaczyłem, że git branch -rdziała ono w zdecydowanej większości (około 90% lub 125 ze 140 ).

Jeśli git branch -rnie działa, sprawdź git config --get remote.origin.fetchzawiera symbol wieloznaczny ( *) zgodnie z tą odpowiedzią


15
Możesz to zrobić git ls-remote [url], abyś nie musiał go najpierw klonować :)
Zsub

142
Ta odpowiedź jest poprawna, ale wprowadzająca w błąd. Pierwszą rzeczą, którą użytkownicy powinni zobaczyć tutaj z wyszukiwarek, jest: git branch -rponieważ jest to poprawna i najprostsza odpowiedź, pytający miał specjalny przypadek, w którym zmodyfikował zachowanie swoich, git branch -rktórych większość użytkowników tu nie przyjmie mieć
Stephan

24
@Stephan: jesteś tego pewien? git branch -rteż nie działało dla mnie. Po prostu wyświetla listę oddziałów już śledzonych lokalnie. Ale git ls-remote --headswymieniono wszystkie gałęzie dostępne w zdalnym repozytorium ...
Rexford,

2
Jeśli ktoś chce pobierać z gałęzi wymienionych za pośrednictwem git ls-remote(a nie wymienionych w git branch -r), musi wykonać git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"przed pobraniem, jak opisano na stackoverflow.com/a/26649770/873282 .
koppor

11
Nie zapomnij zrobić git fetch --allwcześniej, aby uzyskać wszystkie bieżące odległe gałęzie.
A. Attia

173

remote show pokazuje wszystkie gałęzie na pilocie, w tym te, które nie są śledzone lokalnie, a nawet te, które nie zostały jeszcze pobrane.

git remote show <remote-name>

Próbuje również pokazać status gałęzi w stosunku do lokalnego repozytorium:

> git remote show origin
* remote origin
  Fetch URL: C:/git/.\remote_repo.git
  Push  URL: C:/git/.\remote_repo.git
  HEAD branch: master
  Remote branches:
    branch_that_is_not_even_fetched new (next fetch will store in remotes/origin)
    branch_that_is_not_tracked      tracked
    branch_that_is_tracked          tracked
    master                          tracked
  Local branches configured for 'git pull':
    branch_that_is_tracked merges with remote branch_that_is_tracked
    master                 merges with remote master
  Local refs configured for 'git push':
    branch_that_is_tracked pushes to branch_that_is_tracked (fast-forwardable)
    master                 pushes to master                 (up to date)

Dokładnie. Nie pobierano, nie śledzono lokalnie.
Thufir

3
branch_that_is_not_tracked tracked?
Piotr Dobrogost

3
@PiotrDobrogost Tak! branch_that_is_not_trackedto gałąź, która nie jest śledzona przez żadną lokalną gałąź git. Został jednak pobrany do lokalnego repozytorium (więc istnieje zdalny oddział). Z jakiegoś dziwnego powodu git remote showwywołuje ten stan tracked, nawet jeśli nie ma lokalnego oddziału, który śledziłby zdalne sterowanie. W tym przypadku, przeciwieństwem trackedIs new, czyli „nie naciągane”.
Klas Mellbourn,

to nie działa programowo, zbyt trudne do przeanalizowania
Alexander Mills

To złapało szczególny przypadek, w którym miałem lokalną zdalną gałąź, którą następnie usunąłem na pilocie. Następnie git branch -rsugeruje, że nadal istnieje zdalna gałąź, ale git remote show originpokazuje to refs/remotes/origin/my-now-dead-branch stale (use 'git remote prune' to remove). O wiele bardziej przydatny!
icc97

53
git branch -a | grep remotes/*

10
Jest to w zasadzie równoważne temu git branch -r, co według OP nie było wystarczająco dobre.
Cascabel,

9
właściwie oba git branch -ai git branch -rwypisują dla mnie wszystkie odległe gałęzie, nie jestem pewien, czy to, co powiedział PO, jest prawdą. Właśnie skonfigurowałem repozytorium testowe i to zweryfikowałem (miałem tylko master origin origin / master, ale nadal widziałem wszystkie zdalne gałęzie z obiema flagami).
Idan K

2
wygląda na to, że nie wyświetla wszystkich zdalnych gałęzi, jeśli sklonuję z istniejącego ściągniętego repozytorium, a następnie ręcznie wskaż początek na serwerze git. Przyjęta odpowiedź obsługuje tę sprawę.
nielsbot

To rozwiązanie nie wyświetla zdalnych gałęzi utworzonych od czasu ostatniego pobrania.
Anubian Noob,

Dziwna rzecz: od lat używam, git fetcha potem git branch -a, która dopiero niedawno zaczęła mi się nie udać. Być może zachowanie git zostało zmienione?
Sebastian Mach

39

Użycie git branch -rlist wszystkich zdalnych gałęzi i git branch -alist wszystkich gałęzi na lokalnym i zdalnym. Te listy stają się jednak nieaktualne. Aby aktualizować te listy, uruchom

git remote update --prune

który zaktualizuje listę lokalnych oddziałów o wszystkie nowe ze zdalnego i usunie te, których już nie ma. Uruchomienie tego polecenia aktualizacji bez opcji --prune spowoduje pobranie nowych gałęzi, ale nie usunie tych, które nie są już zdalne.

Możesz przyspieszyć tę aktualizację, określając pilota, w przeciwnym razie spowoduje to pobranie aktualizacji ze wszystkich dodanych przez ciebie pilotów

git remote update --prune origin

To rozwiązało mój problem - „git branch -r” działa teraz dla mnie.
Francis Norton

27

Ale

git branch -ar

powinien to zrobić.


41
Przekazywanie obu argumentów jest zbędne. -rzwraca tylko odległe gałęzie. -azwraca oddziały lokalne i zdalne. W ten sposób git branch -ai git branch -arjak uzyskuje się taki sam wynik.
Walter Roman

19

Możesz również zrobić git fetchpo git branch -r. Bez pobierania nie zobaczysz najbardziej aktualnych gałęzi.


git fetch --allmieć wszystkie obecne gałęzie
A. Attia

19

Git Rozgałęzienie - odległe gałęzie

git ls-remote

Dokumentacja Git .


git ls-remote - główki, by uzyskać bardziej szczegółowe wyniki
Wolfgang Fahl,

1
To jest tylko polecenie, które również można znaleźć mój oddział przypadkowo pchnął bez heads/w refs/heads/features/my-branch, dzięki!
msa


9

TL; TR;

Oto rozwiązanie twojego problemu:

git remote update --prune    # To update all remotes
git branch -r                # To display remote branches

lub:

git remote update --prune    # To update all remotes
git branch <TAB>             # To display all branches

5

Najlepszym poleceniem do uruchomienia jest git remote show [remote]. Spowoduje to wyświetlenie wszystkich oddziałów, zdalnych i lokalnych, śledzonych i nieśledzonych.

Oto przykład z projektu open source:

> git remote show origin
* remote origin
  Fetch URL: https://github.com/OneBusAway/onebusaway-android
  Push  URL: https://github.com/OneBusAway/onebusaway-android
  HEAD branch: master
  Remote branches:
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked
    refs/remotes/origin/branding stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    develop merges with remote develop
    master  merges with remote master
  Local refs configured for 'git push':
    develop pushes to develop (local out of date)
    master  pushes to master  (up to date)

Jeśli chcemy tylko uzyskać odległe gałęzie, możemy użyć grep. Polecenie, którego chcielibyśmy użyć to:

grep "\w*\s*(new|tracked)" -E

Za pomocą tego polecenia:

> git remote show origin | grep "\w*\s*(new|tracked)" -E
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked

Możesz również utworzyć dla tego alias:

git config --global alias.branches "!git remote show origin | grep \w*\s*(new|tracked) -E"

Wtedy możesz po prostu biec git branches.




4

Po prostu uruchom git fetchpolecenie. Sprowadzi wszystkie zdalne gałęzie do lokalnego repozytorium, a następnie wykona a, git branch -aaby wyświetlić listę wszystkich gałęzi.


1

Jeśli istnieje zdalna gałąź, o której wiesz, że powinna być na liście, ale nie jest na liście, możesz sprawdzić, czy twoje pochodzenie jest poprawnie skonfigurowane w ten sposób:

git remote show origin

Jeśli to wszystko dobrze, może powinieneś uruchomić aktualizację:

git remote update

Zakładając, że działa poprawnie, powinieneś być w stanie zrobić to, co mówią inne odpowiedzi:

git branch -r

1

Za pomocą tego polecenia

git log -r --oneline --no-merges --simplify-by-decoration --pretty=format:"%n %Cred CommitID %Creset: %h %n %Cred Remote Branch %Creset :%d %n %Cred Commit Message %Creset: %s %n"

CommitID       : 27385d919
Remote Branch  : (origin/ALPHA)
Commit Message :  New branch created

Zawiera listę wszystkich zdalnych gałęzi, w tym komunikaty zatwierdzeń i identyfikatory zatwierdzeń, do których odwołują się zdalne gałęzie.


1

Użyłbym:

git branch -av

To polecenie pokazuje nie tylko listę wszystkich gałęzi, w tym gałęzi zdalnych rozpoczynających się od /remote, ale także dostarcza *informacji zwrotnych na temat tego, co zaktualizowałeś i komentarzy na temat ostatniego zatwierdzenia.


0

Upewnij się, że zdalne pochodzenie, które wymieniasz, to tak naprawdę repozytorium, które chcesz, a nie starszy klon.


0

Skończyło się na robieniu bałaganu w skorupce, aby uzyskać to, czego chciałem. Właśnie połączyłem gałęzie ze zdalnego źródła:

git branch -r --all --merged \
    | tail -n +2 \
    | grep -P '^  remotes/origin/(?!HEAD)' \
    | perl -p -e 's/^  remotes\/origin\///g;s/master\n//g'

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.