Sklonowałem repozytorium Git, które zawiera około pięciu gałęzi. Jednak kiedy to git branch
widzę, widzę tylko jedną z nich:
$ git branch
* master
Wiem, że mogę zrobić, git branch -a
aby zobaczyć wszystkie gałęzie, ale jak miałbym wyciągnąć wszystkie gałęzie lokalnie, więc kiedy to zrobię git branch
, pokazuje to?
$ git branch
* master
* staging
* etc...
git
branch
git-branch
David542
źródło
źródło
--single-branch
ustawienia podczas klonowania: stackoverflow.com/questions/17714159/… (git fetch --all
nigdy nie zadziała, jeśli podasz tylko jedną gałąź!)git clone --bare <repo url> .git
(zauważ, że musisz dodać „-bare” i „.git” na końcu, aby sklonować repozytorium jako repozytorium „bare”), następniegit config --bool core.bare false
(ustawia flagę „bare” na false), a następniegit reset --hard
(przesuwa HEAD do aktualnej HEAD na repo). Teraz, jeśligit branch
powinieneś zobaczyć wszystkie gałęzie z klonowanego repozytorium.Odpowiedzi:
Możesz pobrać wszystkie gałęzie ze wszystkich pilotów w ten sposób:
Zasadniczo jest to ruch siłowy .
fetch
aktualizuje lokalne kopie zdalnych oddziałów, więc jest to zawsze bezpieczne dla lokalnych oddziałów, ALE :fetch
nie aktualizuje oddziałów lokalnych (które śledzą oddziały zdalne); jeśli chcesz zaktualizować swoje lokalne oddziały, nadal musisz pobrać każdy oddział.fetch
nie utworzy oddziałów lokalnych (które śledzą oddziały zdalne), musisz to zrobić ręcznie. Jeśli chcesz wyświetlić listę wszystkich zdalnych gałęzi:git branch -a
Aby zaktualizować lokalne oddziały, które śledzą oddziały zdalne:
Może to jednak nadal być niewystarczające. Będzie działać tylko dla lokalnych oddziałów, które śledzą oddziały zdalne. Aby śledzić wszystkie odległe gałęzie, uruchom ten oneliner PRZED
git pull --all
:Wersja TL; DR
(Wygląda na to, że pull pobiera wszystkie gałęzie ze wszystkich pilotów, ale zawsze pobieram najpierw, aby się upewnić).
Uruchom pierwszą komendę tylko wtedy, gdy na serwerze znajdują się zdalne gałęzie, które nie są śledzone przez lokalne oddziały.
PS AFAIK
git fetch --all
igit remote update
są równoważne.Komentarz Kamila Szota , który uznał za użyteczny.
źródło
git checkout -b localname remotename/remotebranch
for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done
ponieważ twój kod utworzył lokalne oddziały o nazwie origin / branchname i otrzymywałem „refname 'origin / branchname” jest dwuznaczny za każdym razem, gdy o nim mówiłemgit pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done
. Zmiana usuwa HEAD.for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
Aby wyświetlić listę zdalnych oddziałów:
git branch -r
Możesz je sprawdzić jako lokalne oddziały za pomocą:
git checkout -b LocalName origin/remotebranchname
źródło
git checkout remotebranchname
i działa. jaka jest różnica w twoim rozwiązaniu?git checkout remotebranchname
służy do tworzenia nowej niezwiązanej gałęzi o nazwie remotebranchname .Konieczne będzie utworzenie oddziałów lokalnych śledzących oddziały zdalne.
Zakładając, że masz tylko jednego pilota o nazwie
origin
, ten fragment utworzy lokalne oddziały dla wszystkich zdalnych śledzenia:Następnie
git fetch --all
zaktualizuje wszystkie lokalne kopie zdalnych oddziałów.Ponadto
git pull --all
zaktualizuje lokalne gałęzie śledzenia, ale w zależności od lokalnych zatwierdzeń i tego, jak ustawiona jest opcja konfiguracji „scalania”, może utworzyć zatwierdzenie scalania, szybkie przewijanie do przodu lub niepowodzenie.źródło
git pull --all
zaktualizujesz wszystkie lokalne oddziały śledzenia? O ile mogę powiedzieć, aktualizuje tylko bieżącą gałąź ze wszystkich pilotów.origin
? Zobacz tę odpowiedź, która będzie działać na wszystkich zdalnych nazwach.Jeśli zrobisz:
wtedy będą wszyscy lokalnie. Jeśli następnie wykonasz:
zobaczysz je na liście jako piloty / pochodzenie / nazwa oddziału. Ponieważ są tam lokalnie, możesz robić z nimi, co tylko chcesz. Na przykład:
lub
lub
źródło
--all
)git fetch -all
pobiera wszystkie gałęzie wszystkich pilotów.git fetch origin
pobiera wszystkie gałęzie pilotaorigin
. O to później poprosił PO.--all
oznacza „wszystkie piloty”, a nie „wszystkie gałęzie danego pilota”. To ostatnie jest implikowane przez każde pobranie ze zdalnego.Zakłada się, że wszystkie gałęzie są śledzone.
Jeśli nie są, możesz wystrzelić to w Bash:
Następnie uruchom polecenie.
źródło
->
której prawdopodobnie będą istnieć wgit branch -r
wynikach jako „origin / HEAD -> origin / master”Branch 'origin/quote-filenames' set up to track local branch 'master'.
Pożądane dane wyjściowe to:Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'.
To jest wstecz , ustawiając źródło śledzenia pilota. Zobacz tę odpowiedź, aby uzyskać poprawkę.git fetch
sprawdzić innych zdalnych gałęzi i nie działałem. Lekcja polega na tym, że musisz śledzić odległe gałęzie. Gracias!for
Pętla Bash nie działała dla mnie, ale działało dokładnie tak, jak chciałem. Wszystkie gałęzie z mojego pochodzenia odzwierciedlone lokalnie jako ta sama nazwa.Zobacz komentarz Mike'a DuPont poniżej. Myślę, że próbowałem to zrobić na serwerze Jenkins, który pozostawia go w trybie odłączonej głowy.
źródło
fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository
po prostym klonie. Najpierw odłącz głowę. Zrobiłem to zgit checkout <SHA>
git checkout --detach # detach the head
wtedygit fetch origin \'+refs/heads/*:refs/heads/*
Zastosowanie
git fetch && git checkout RemoteBranchName
.Działa dla mnie bardzo dobrze ...
źródło
origin/branch
; wystarczy powiedzieć tylkobranch
).Po sklonowaniu repozytorium wszystkie informacje o gałęziach są faktycznie pobierane, ale gałęzie są ukryte. Za pomocą polecenia
możesz wyświetlić wszystkie gałęzie repozytorium i za pomocą polecenia
możesz następnie „ręcznie” pobrać je pojedynczo.
Jest jednak dużo czystszy i szybszy sposób, choć jest to nieco skomplikowane. Aby to osiągnąć, musisz wykonać trzy kroki:
Pierwszy krok
utwórz nowy pusty folder na swoim komputerze i klonuj kopię lustrzaną folderu .git z repozytorium:
lokalne repozytorium w folderze my_repo_folder jest nadal puste, jest teraz tylko ukryty folder .git, który można zobaczyć za pomocą polecenia „ls -alt” z terminala.
Drugi krok
przełącz to repozytorium z pustego (pustego) do zwykłego, zmieniając wartość logiczną „gołą” konfiguracji git na false:
Trzeci krok
Chwyć wszystko, co znajduje się w bieżącym folderze i utwórz wszystkie gałęzie na komputerze lokalnym, dzięki czemu jest to normalne repo.
Teraz możesz po prostu wpisać polecenie
git branch
i możesz zobaczyć, że wszystkie gałęzie zostały pobrane.Jest to szybki sposób klonowania repozytorium git ze wszystkimi gałęziami jednocześnie, ale nie jest to coś, co chcesz zrobić dla każdego projektu w ten sposób.
źródło
Możesz pobrać wszystkie gałęzie, wykonując:
lub:
The
--depth=10000
parametr może pomóc, jeśli masz płytkie repozytorium.Aby wyciągnąć wszystkie gałęzie, użyj:
Jeśli powyższe nie zadziała, poprzedź powyższe polecenie:
jak
remote.origin.fetch
może obsługiwać tylko konkretną gałąź podczas pobierania, szczególnie gdy klonujesz swoje repozytorium--single-branch
. Sprawdź to:git config remote.origin.fetch
.Następnie powinieneś mieć możliwość kasy dowolnego oddziału.
Zobacz też:
Aby wypchnąć wszystkie gałęzie do pilota, użyj:
ostatecznie
--mirror
do odzwierciedlenia wszystkich referencji.Jeśli Twoim celem jest zduplikowanie repozytorium, zobacz: Duplikowanie artykułu z repozytorium w witrynie GitHub.
źródło
depth=1
), a konfiguracja określiła również jedną konkretną gałąź dlafetch
-depth=1000
parametrem była poprawka, która pomogła mi pobrać konkretną gałąź zdalnąpull --all
nie ciągnie wszystkich gałęzi, ale wszystkie pilotyZwykle używam tylko takich poleceń:
Trochę krótsza wersja:
źródło
Wierzę, że sklonowałeś repozytorium poprzez:
Teraz przejdź do tego folderu za pomocą cd:
Jeśli wpiszesz
git status
, zobaczysz wszystkie:Aby wyświetlić wszystkie ukryte typy oddziałów:
Wyświetli listę wszystkich zdalnych gałęzi.
Teraz, jeśli chcesz dokonać transakcji w dowolnym oddziale, po prostu wpisz:
źródło
Jeśli szukasz rozwiązania, które pozwoli uzyskać wszystkie gałęzie, a następnie przeprowadzisz migrację wszystkiego na inny serwer Git, przygotuję poniższy proces. Jeśli chcesz tylko zaktualizować wszystkie gałęzie lokalnie, zatrzymaj się przy pierwszej pustej linii.
źródło
git fetch git pull
stackoverflow.com/a/292359/1114926pull
rzeczywiście robifetch
pierwszy, ale łatwiej jest stwierdzić, czy problem pochodzi zfetch
części,pull
czy z późniejszejmerge
części,pull
kiedyfetch
jest wykonywany niezależnie.Po sklonowaniu głównego repozytorium wystarczy uruchomić
źródło
Upewnij się, że wszystkie zdalne gałęzie można pobrać z
.git/config
pliku.W tym przykładzie
origin/production
można pobrać tylko gałąź, nawet jeśli spróbujeszgit fetch --all
nic nie zrobić , oprócz pobieraniaproduction
gałęzi:Ten wiersz należy zastąpić:
Następnie uruchom
git fetch
itp ...źródło
git config --get remote.origin.fetch
a następnie (destrukcyjnie) ustawić:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
Pętla wydawała mi się nie działać i chciałem zignorować origin / master. Oto, co dla mnie zadziałało.
Po tym:
źródło
grep | awk
antypatternu :git branch -r | awk -F 'origin/' '!/HEAD|master/{
...Tylko te trzy polecenia otrzymają wszystkie gałęzie:
źródło
pull --all
. Ale jeśli nadal jest potrzebna, to druga odpowiedź, autorstwa @Johnno Nola, zakładając, że wszystkie gałęzie są śledzone, pomieszane z tą odpowiedzią, jest właściwą drogą.Dlaczego nikt nie odpowiada chłopcom na pytania i nie wyjaśnia, co się dzieje?
Śledź wszystkie zdalne oddziały:
Śledź wszystkie gałęzie, które istnieją w zdalnym repozytorium.
Zrób to ręcznie:
Zastąpiłbyś
<branch>
gałąź wyświetlaną z wyjściagit branch -r
.Zrób to za pomocą skryptu bash
Zaktualizuj informacje o zdalnych oddziałach na komputerze lokalnym:
Spowoduje to pobranie aktualizacji oddziałów ze zdalnego repozytorium, które śledzisz w lokalnym repozytorium. Nie zmienia to lokalnych oddziałów. Twoje lokalne repozytorium git jest teraz świadome rzeczy, które wydarzyły się w gałęziach zdalnego repo. Przykładem może być przekazanie nowego zatwierdzenia do zdalnego wzorca, wykonanie pobierania poinformuje cię teraz, że twój lokalny opóźnienie jest opóźniony o 1 zatwierdzenie.
Zaktualizuj informacje o zdalnych oddziałach na komputerze lokalnym i zaktualizuj oddziały lokalne:
Czy pobieranie, a następnie scalanie wszystkich gałęzi ze zdalnego do lokalnego oddziału. Przykładem może być przekazanie nowego zatwierdzenia do zdalnego wzorca, wykonanie ściągnięcia zaktualizuje lokalne repo o zmianach w zdalnym oddziale, a następnie scali te zmiany w oddziale lokalnym. Może to stworzyć dość bałagan z powodu konfliktów scalania.
źródło
Napisałem mały skrypt do zarządzania klonowaniem nowego repozytorium i tworzeniem lokalnych gałęzi dla wszystkich zdalnych gałęzi.
Najnowszą wersję można znaleźć tutaj :
Aby go użyć, po prostu skopiuj go do katalogu git bin (dla mnie to jest
C:\Program Files (x86)\Git\bin\git-cloneall
), a następnie w wierszu polecenia:Klonuje jak zwykle, ale tworzy lokalne gałęzie śledzące dla wszystkich zdalnych gałęzi.
źródło
Jak pobrać wszystkie gałęzie Git Śledzenie pojedynczego pilota.
Zostało to przetestowane i działa w systemach Red Hat i Git Bash w systemie Windows 10.
TLDR:
Wyjaśnienie:
Jedna wkładka sprawdza, a następnie pobiera wszystkie gałęzie oprócz HEAD.
Wymień gałęzie zdalnego śledzenia.
Zignoruj HEAD.
Zdejmij nazwę oddziału z pilotów.
Kasa wszystkich oddziałów śledzących jednego pilota.
Pobierz dla wyewidencjonowanego oddziału.
Technicznie rzecz biorąc, pobieranie nie jest potrzebne dla nowych lokalnych oddziałów.
Może to być wykorzystane do jednego
fetch
lub obupull
gałęzi, które są zarówno nowe, jak i mają zmiany w pilotach.Tylko upewnij się, że ciągniesz tylko wtedy, gdy jesteś gotowy do połączenia.
Konfiguracja testowa
Sprawdź repozytorium z adresem URL SSH.
Przed
Sprawdź oddziały lokalnie.
Wykonywać polecenia
Wykonaj jedną linijkę.
Po
Sprawdź, czy lokalne oddziały obejmują oddziały zdalne.
źródło
Użytkownicy systemu Windows korzystający z programu PowerShell:
źródło
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" } }
Oto coś, co uważam za solidne:
HEAD
celu śledzeniaorigin/HEAD
origin
Nie jest konieczne, aby
git fetch --all
jak przechodząc-all
dogit pull
podań tej opcji do wewnętrznejfetch
.Podziękowania dla tej odpowiedzi .
źródło
Oto wersja jednowierszowa Perla podana w zaakceptowanej odpowiedzi:
git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file
Możesz uruchomić plik wyjściowy jako skrypt powłoki, jeśli chcesz.
Przez przypadek usunęliśmy nasze repozytorium projektu Stash. Na szczęście ktoś stworzył widelec tuż przed przypadkową utratą. Sklonowałem widelec do mojego lokalnego (pominę szczegóły, jak to zrobiłem). Kiedy już miałem widelec w pełni w mojej okolicy, prowadziłem jedną linijkę. Zmodyfikowałem adres URL pilota (w moim przypadku początek), aby wskazywał docelowe repozytorium, do którego odzyskujemy:
git remote set-url origin <remote-url>
I w końcu pchnął wszystkie gałęzie do pochodzenia w taki sposób:
git push --all origin
i wróciliśmy do pracy.
źródło
Możemy umieścić wszystkie nazwy gałęzi lub tagów w pliku tymczasowym, a następnie wykonać polecenie git pull dla każdej nazwy / tagu:
źródło
Jeśli masz problemy, a
fetch --all
następnie śledź swój zdalny oddział:źródło
Aby uniknąć komunikatu o błędzie „krytyczny: gałąź o nazwie„ origin / master ”już istnieje.”, Potrzebujesz:
źródło
Na podstawie odpowiedzi Learath2, oto co zrobiłem po zrobieniu
git clone [...]
icd
przejściu do utworzonego katalogu:git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b
Pracowałem dla mnie, ale nie wiem, czy to zadziała dla ciebie. Bądź ostrożny.
źródło
Teraz lokalnie twój
yourNewLocalBranchName
jest twójrequiredRemoteBranch
.źródło
Dla użytkowników programu Visual Studio w konsoli Menedżera pakietów:
oddział git | % {git fetch w górę; git merge upstream / master}
źródło
Próbowałem na wiele sposobów, tylko ten jest prosty i działa dla mnie.
źródło
Ustaw alias: (na podstawie najwyższej odpowiedzi)
Teraz, aby śledzić wszystkie gałęzie:
git track-all-branches
źródło