Jak pobrać wszystkie gałęzie Git

Sklonowałem repozytorium Git, które zawiera około pięciu gałęzi. Jednak kiedy robię git branch widzę tylko jedną z nich:

$ git branch
* master

Wiem, że mogę zrobić git branch -a, aby zobaczyć wszystkie gałęzie, ale jak mam wyciągnąć wszystkie gałęzie lokalnie, więc kiedy to zrobię git branch, pokazuje to co następuje?

$ git branch
* master
* staging
* etc...
Author: Peter Mortensen, 2012-04-25

22 answers

Możesz pobrać jedną gałąź ze wszystkich pilotów w następujący sposób:

git fetch --all

fetch aktualizuje lokalne kopie zdalnych gałęzi, więc jest to zawsze bezpieczne dla lokalnych gałęzi , ale :

  1. fetch nie będzie aktualizować lokalnych gałęzi (które śledzą zdalnych gałęzi); jeśli chcesz zaktualizować swoje lokalne gałęzie, nadal musisz wyciągnąć każdą gałąź.

  2. fetch nie utworzy lokalnych oddziałów (które śledzą zdalnie gałęzie), trzeba to zrobić ręcznie. Jeśli chcesz wylistować wszystkie zdalne gałęzie: git branch -a

Do zaktualizuj lokalne gałęzie, które śledzą odległe gałęzie:

git pull --all

Jednak może to być wciąż niewystarczające. Będzie działać tylko dla lokalnych gałęzi, które śledzą zdalne gałęzie. Aby śledzić wszystkie zdalne gałęzie wykonaj ten oneliner przed git pull --all:

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

TL; wersja DR

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

(wydaje się, że pull pobiera wszystkie gałęzie ze wszystkich piloty, ale zawsze pobieram najpierw dla pewności)

Uruchom pierwsze polecenie tylko wtedy, gdy na serwerze są zdalne gałęzie, które nie są śledzone przez lokalne gałęzie.

P. S. AFAIK git fetch --all i git remote update są równoważne.



Komentarz Kamila Szota , który 74 (przynajmniej) osoby uznały za przydatny.

Musiałem użyć:

for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done

Ponieważ twój kod stworzył lokalne gałęzie o nazwie origin/branchname i Dostawałem " refname "pochodzenie/branchname" jest niejednoznaczne, gdy I / align = "left" /

 1310
Author: Wookie88,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-31 19:04:49

Do listy zdalnych gałęzi:
git branch -r

Możesz sprawdzić je jako lokalne oddziały z:
git checkout -b LocalName origin/remotebranchname

 447
Author: Learath2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-26 20:33:37

Będziesz musiał utworzyć lokalne gałęzie śledzące gałęzie zdalne.

Zakładając, że masz tylko jeden zdalny o nazwie origin, Ten fragment utworzy lokalne gałęzie dla wszystkich zdalnych śledzenia:

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Po tym, git fetch --all zaktualizuje wszystkie lokalne kopie zdalnych gałęzi.

Również, git pull --all zaktualizuje lokalne gałęzie śledzenia, ale w zależności od lokalnych zatwierdzeń i ustawienia opcji konfiguracji "merge" może to spowodować utworzenie zmiany scalającej, przewinięcie do przodu lub niepowodzenie.

 162
Author: Michael Renner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-28 15:52:59

Jeśli zrobisz:

git fetch origin
Wtedy wszyscy będą tam lokalnie. Jeśli następnie wykonasz:
git branch -a

Zobaczysz je jako remotes / origin / branch-name. Ponieważ są tam lokalnie, możesz z nimi robić, co chcesz. Na przykład:

git diff origin/branch-name 

Lub

git merge origin/branch-name

Lub

git checkout -b some-branch origin/branch-name
 99
Author: GoZoner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-29 19:46:40
$ git remote update
$ git pull --all

Zakłada się, że wszystkie gałęzie są śledzone.

Jeśli nie są możesz odpalić to w Bash:

for remote in `git branch -r `; do git branch --track $remote; done

Następnie uruchom polecenie.

 44
Author: Johnno Nolan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-31 19:06:41

Użyj git fetch && git checkout RemoteBranchName.

Dla mnie działa bardzo dobrze...
 36
Author: Regis Zaleman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-31 19:20:02

Bash dla pętli nie działał dla mnie, ale to zrobił dokładnie to, co chciałem. Wszystkie gałęzie z mojego pochodzenia miały tę samą nazwę lokalnie.

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

Edited: See Mike DuPont ' s comment below. Myślę, że próbowałem to zrobić na serwerze Jenkins, który pozostawia go w trybie odłączonej głowy.

 28
Author: Tim Lum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-04 22:46:31

Po sklonowaniu repozytorium wszystkie informacje o gałęziach są faktycznie pobierane, ale gałęzie są ukryte. Z poleceniem

$ git branch -a

Możesz wyświetlić wszystkie gałęzie repozytorium, a za pomocą polecenia

$ git checkout -b branchname origin/branchname

Możesz następnie" pobrać " je ręcznie pojedynczo.


Istnieje jednak znacznie czystszy i szybszy sposób, choć jest to nieco skomplikowane. Aby to osiągnąć, potrzebne są trzy kroki:

  1. Pierwszy krok

    Create a nowy pusty folder na komputerze i klon kopii lustrzanej.folder git z repozytorium:

    $ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
    $ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
    

    Lokalne repozytorium wewnątrz folderu my_repo_folder jest nadal puste, jest tylko Ukryty .folder git teraz, który możesz zobaczyć poleceniem "LS-alt" z terminala.

  2. Drugi krok

    Przełącz to repozytorium z pustego (gołego) repozytorium na zwykłe, zmieniając wartość logiczną "bare" konfiguracji Gita na false:

    $ git config --bool core.bare false
    
  3. Trzeci Krok

    Chwyć wszystko, co znajduje się w bieżącym folderze i utwórz wszystkie gałęzie na lokalnej maszynie, czyniąc to normalnym repo.

    $ git reset --hard
    

Więc teraz możesz po prostu wpisać polecenie {[5] } i zobaczyć, że wszystkie gałęzie są pobrane.

Jest to szybki sposób, w jaki możesz sklonować repozytorium git ze wszystkimi gałęziami naraz, ale nie jest to coś, co chcesz zrobić dla każdego projektu w tym sposób.

 26
Author: FedericoCapaldo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-06 20:32:58

Zwykle używam tylko takich komend:

git fetch origin
git checkout --track origin/remote-branch

Trochę krótsza wersja:

git fetch origin
git checkout -t origin/remote-branch
 23
Author: marioosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 18:36:38

Możesz pobrać wszystkie gałęzie przez:

git fetch --all

Lub:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

parametr --depth=10000 może pomóc, jeśli masz spłycone repozytorium.


Aby wyciągnąć wszystkie gałęzie, użyj:

git pull --all

Jeśli powyższe polecenie nie zadziała, poprzedź powyższe polecenie:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

Ponieważ remote.origin.fetch może obsługiwać tylko konkretną gałąź podczas pobierania, zwłaszcza gdy sklonowałeś repo za pomocą --single-branch. Sprawdź to przez: git config remote.origin.fetch.

Po tym powinieneś być w stanie sprawdź dowolny oddział.

Zobacz też:


Aby przesunąć wszystkie gałęzie do pilota, użyj:

git push --all

W końcu --mirror aby odzwierciedlić wszystkie refy.


Jeśli twoim celem jest duplikowanie repozytorium, zobacz artykuł: duplikowanie repozytorium na GitHub.

 18
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-13 17:03:57

Jeśli szukasz rozwiązania, aby pobrać wszystkie gałęzie, a następnie przenieść wszystko na inny serwer Git, przygotowałem poniższy proces. Jeśli tylko chcesz, aby wszystkie gałęzie były aktualizowane lokalnie, zatrzymaj się na pierwszej pustej linii.

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>
 13
Author: ingyhere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-08 02:48:34

Wydaje mi się, że sklonowałeś repozytorium przez

git clone https://github.com/pathOfrepository

Teraz przejdź do tego folderu używając płyty cd

cd pathOfrepository

Jeśli wpiszesz git status

Możesz zobaczyć wszystkie

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

Aby zobaczyć wszystkie ukryte branch type

 git branch -a

Wyświetli listę wszystkich zdalnych gałęzi

Teraz, jeśli chcesz dokonać kasy na jakimś konkretnym oddziale po prostu wpisz

git checkout -b localBranchName origin/RemteBranchName
 11
Author: Abhinav bhardwaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-04 11:42:29

Po sklonowaniu głównego repozytorium możesz po prostu wykonać

git fetch && git checkout <branchname>
 9
Author: Davidacce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-13 11:43:56

Upewnij się, że wszystkie zdalne gałęzie są pobierane w pliku .git/config.

W tym przykładzie można pobrać tylko gałąź origin/production, nawet jeśli spróbujesz zrobić git fetch --all nic się nie stanie poza pobraniem gałęzi production:

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

Wiersz ten należy zastąpić:

[origin]
fetch = +refs/heads/*:refs/remotes/origin/*

Następnie uruchom git fetch itd...

 8
Author: Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 08:43:21

Zapętlanie nie wydawało mi się działać i chciałem zignorować origin / master. Oto, co mi się udało.

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

Potem:

git fetch --all
git pull --all
 7
Author: poxion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-04 05:09:33

Tylko te 3 komendy otrzymają wszystkie gałęzie

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false         

git reset --hard                  
 5
Author: Izabela Skibinska,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-27 01:46:34

Napisałem mały skrypt do klonowania nowych repo i tworzenia lokalnych gałęzi dla wszystkich zdalnych gałęzi.

Najnowszą wersję znajdziesz tutaj :

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

Aby go użyć, po prostu skopiuj go do katalogu git bin( dla mnie jest to C:\Program Files (x86)\Git\bin\git-cloneall), Następnie w linii poleceń:

git cloneall [standard-clone-options] <url>

Klonuje jak zwykle, ale tworzy lokalne gałęzie śledzące dla wszystkich odległych gałęzi.

 4
Author: tstone2077,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-28 19:22:23

Dla użytkowników Windows korzystających z PowerShell:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all
 2
Author: kiewic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 23:43:09

Możemy umieścić wszystkie nazwy gałęzi lub znaczników w pliku tymczasowym, a następnie wykonać git pull dla każdej nazwy / znacznika:

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done
 1
Author: anhlc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-05 04:32:19

Oto coś, co uznałbym za solidne:

    Nie aktualizuje zdalnego śledzenia istniejących gałęzi]}
  • nie próbuje zaktualizować HEAD do śledzenia origin/HEAD
  • pozwala pilotom o nazwach innych niż origin
  • poprawnie Shell quoted
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

Nie jest konieczne git fetch --all, ponieważ przejście -all do git pull przekazuje tę opcję do wewnętrznego fetch.

Kredyt na tę odpowiedź .

 1
Author: Tom Hale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-14 16:08:11

Na podstawie odpowiedzi Learath2, oto co zrobiłem po zrobieniu git clone [...] i cd - ing do utworzonego katalogu:

git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

Zadziałało dla mnie, ale nie wiem, czy zadziała dla Ciebie. Bądź ostrożny.
 0
Author: erikano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-02 15:23:33
git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

Teraz lokalnie Twoje yourNewLocalBranchName jest Twoje requiredRemoteBranch.

 0
Author: chhotu sardar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-19 09:20:49