Jak pobrać tylko jedną gałąź zdalnego repozytorium Git?


247

Chciałbym pobrać pojedynczą gałąź (nie wszystkie) zdalnego repozytorium i utworzyć lokalną gałąź śledzenia, która może śledzić dalsze aktualizacje tej zdalnej gałęzi. Pozostałe gałęzie w zdalnym repozytorium są bardzo duże, więc chciałbym ich nie pobierać. Jak mam to zrobic?

Edycja: sam to wymyśliłem, ale StackOverflow nie pozwala mi udzielić odpowiedzi jako odpowiedzi, więc zamiast tego umieszczę ją tutaj w pytaniu.

Użyj opcji -t, aby zdalnie dodać, np .:

git remote add -t remote-branch remote-name remote-url

Możesz użyć wielu -t branchopcji, aby " " złapać wiele gałęzi.


3
Klon git pobiera całe repozytorium, w tym wszystkie gałęzie. Możesz wykonywać płytkie kopie, ale pozwala to tylko określić liczbę poprawek, a nie które gałęzie.
Ikke

Pewnie, że możesz odpowiedzieć na własne pytanie, dlaczego nie możesz?
CharlesB

2
Myślę, że PO oznaczało, że nie mógł wtedy odpowiedzieć. StackOverflow określa minimalny czas, jaki musi upłynąć, zanim będziesz mógł odpowiedzieć na swoje pytanie.
Lars Nordin,

1
Cześć OP, fajnie byłoby teraz dodać swoją odpowiedź. W ten sposób możemy głosować na to (i porównać z innymi odpowiedziami)
lulalala

3
Polecenie git zdalnego dodawania dodaje zdalną gałąź, która nie ma nic wspólnego z pobieraniem gałęzi!
Chris Halcrow,

Odpowiedzi:


220
git fetch <remote_name> <branch_name>

Pracował dla mnie.


14
Właśnie dowiedziałem się, że pobrana gałąź jest dostępna FETCH_HEADpo pobraniu. Dzięki!
Christoph,

4
następnie git checkout FETCH_HEADdo kasy
d9k

Proste i łatwe.
gsumk

Jak zdobyć <nazwa_zdatki>?
mrgloom,

@mrgloom w większości przypadków remote_namejest origin. np .:git fetch origin <branch_name>
Saahithyan Vigneswaran

67

Jednym ze sposobów jest:

git fetch <remotename> <remote branch>:refs/remotes/<remotename>/<local branch>

Nie konfiguruje to jednak śledzenia.

Aby uzyskać więcej informacji, zobacz dokumentację git fetch .

EDYCJA : Jak zauważa @ użytkownik 1338062 poniżej : jeśli nie masz jeszcze lokalnego klonu repozytorium, w którym chcesz dodać nowy oddział, ale chcesz utworzyć nowe lokalne repozytorium, to git clone --branch <branch_name> --single-branch <repo_url>zapewnia krótsze rozwiązanie.


1
Dzięki temu robi to, o co prosi operacja. Aby utworzyć gałąź śledzenia git checkout -t <gałąź zdalna> / <nazwa gałęzi> <nazwa gałęzi>
Ken

7
Jeśli po prostu to zrobię git checkout <branchname>, widzę, że git automatycznie konfiguruje gałąź śledzenia, jeśli jedyną gałęzią o tej nazwie jest gałąź zdalna.
bukzor

1
to była jedyna rzecz, która działała dla mnie. mimo że konfiguracja została skonfigurowana tak, aby pobierała tylko referencje dla jednej gałęzi, nadal pobierała referencje do wszystkich gałęzi za pomocą funkcji pobierania lub ściągania. to polecenie pociągnęło tylko gałąź, którą chciałem, więc repo miało tylko 500 KB, a nie 5 MB. dzięki.
herostwist

1
Ta odpowiedź jest prawdopodobnie nieaktualna. git cloneteraz obsługuje --branchi --single-branchopcje, opublikowałem odpowiedź z demonstracją .
user1338062,

3
@ user1338062 Jest to nadal ważne, jeśli chcesz pobrać tylko nową gałąź (nie wszystkie gałęzie korzystające z git fetch) po klonowaniu
rubyprince

35

Wiem, że jest już wiele odpowiedzi, ale oto kroki, które zadziałały dla mnie:

  1. git fetch <remote_name> <branch_name>
  2. git branch <branch_name> FETCH_HEAD
  3. git checkout <branch_name>

Opierają się one na odpowiedzi @Abdulsattar Mohammed, komentarzu @Christoph do tej odpowiedzi oraz na innych przepełnionych stosach pytań i ich odpowiedziach:


1
Najbardziej użyteczna odpowiedź tutaj IMO
Daniel Holmes,

31

Aby zaktualizować istniejący pilot do śledzenia określonych oddziałów, użyj:

git remote set-branches <remote-name> <branch-name>

Od git help remote:

set-branches
    Changes the list of branches tracked by the named remote. This can be used to track a subset of the available remote branches
    after the initial setup for a remote.

    The named branches will be interpreted as if specified with the -t option on the git remote add command line.

    With --add, instead of replacing the list of currently tracked branches, adds to that list.

1
Niesamowite, byłem w --single-branchrepozytorium i nie mogłem później pobrać dodatkowych oddziałów. Dzięki!
Yajo,

22

Jednym ze sposobów na to:

w .git / config fetch dla zdalnego repozytorium powinno być ustawione na pobieranie dowolnej gałęzi:

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

aby pobrać zdalną gałąź:

git fetch origin branch-name

aby utworzyć oddział lokalny „nazwa gałęzi” skonfigurowany do śledzenia oddziału zdalnego „nazwa gałęzi”.

git checkout -b branch-name origin/branch-name

aby wyświetlić listę wszystkich gałęzi

git branch -a

16

Skopiowano z postu autora:

Użyj -topcji, aby git remote addnp .:

git remote add -t remote-branch remote-name remote-url

Możesz użyć wielu -t branchopcji, aby złapać wiele gałęzi.


10
Głosujący, dlaczego odpowiadasz z istniejącą odpowiedzią w tym samym wątku?
Bowen,

13

Jeśli chcesz zmienić domyślne ustawienia „git pull” i „git fetch”, aby pobierać tylko określone gałęzie, możesz edytować .git / config, aby zdalna konfiguracja wyglądała następująco:

[remote "origin"]
  fetch = +refs/heads/master:refs/remotes/origin/master

Domyślnie pobierze on tylko wzorzec z miejsca pochodzenia. Zobacz więcej informacji: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

EDYCJA: Właśnie zdałem sobie sprawę, że jest to to samo, co opcja -t robi dla zdalnego dodawania git. Przynajmniej jest to dobry sposób, aby to zrobić po dodaniu pilota, jeśli nie chcesz go usunąć i dodać ponownie za pomocą -t.


1
link progit.org/book/ch9-5 został przeniesiony na git-scm.com/book/en/Git-Internals-The-Refspec
tutaj

8

Dla kompletności, oto przykładowe polecenie nowego zamówienia:

git clone --branch gh-pages --single-branch git://github.com/user/repo

Jak wspomniano w innych odpowiedziach, ustawia się remote.origin.fetchtak:

[remote "origin"]
        url = git://github.com/user/repo
        fetch = +refs/heads/gh-pages:refs/remotes/origin/gh-pages

5

wersja git: 2.74

Tak to robię:

git remote add [REMOTE-NAME] [REMOTE-URL]
git fetch [REMOTE-NAME] -- [BRANCH]

4

wersja git 2.16.1. okna 4

Wystarczy wykonać git fetch remoteRepositoryName branchName (eg: git fetch origin my_local_branch) . Pobieranie zostanie wykonane i zostanie utworzony nowy oddział lokalny o tej samej nazwie, a śledzenie zostanie ustawione na oddział zdalny.

Następnie wykonaj git checkout branchName


1
gałąź nie pojawi się pod, git branchdopóki nie wejdziesz do kasy
commonpike

3

Moje obejścia:

git fetch --depth=1
git checkout <branch_name>

jeśli nie masz lokalnego klona:

git clone --depth 1 -b <branch_name> <repo_url>

3
  1. Wybierz dowolne <remote_name>, którego chcesz użyć (nie krępuj się origin i pomiń krok 1.)
  2. git remote add <remote_name> <remote_url>
  3. git fetch <remote_name> <branch>
  4. Wybierz dowolny <your_local_branch_name>, którego chcesz użyć. Może być taki sam jak <branch>.
  5. git checkout <remote_name>/<branch> -b <your_local_branch_name>

Mam nadzieję, że to pomaga!


2

Odpowiedź faktycznie zależy od bieżącej listy posiadanych gałęzi śledzenia. Możesz pobrać konkretną gałąź ze zdalnego git fetch <remote_name> <branch_name> tylko wtedy, gdy gałąź znajduje się już na liście gałęzi śledzących (możesz to sprawdzić git branch -r).

Załóżmy, że wcześniej sklonowałem pilota z opcją --single-branch, aw tym przypadku jedyną gałęzią śledzenia, którą mam, jest „sklonowana”. Jestem trochę oszołomiony zaleceniami ręcznego dostosowywania konfiguracji git, a także wpisywaniem git remote add <remote_name> <remote_url>poleceń. Ponieważ „git remote add” konfiguruje nowego pilota, to oczywiście nie działa z istniejącym zdalnym repozytorium; podanie opcji „-t gałąź” nie pomogło mi.

Jeśli pilot istnieje, a gałąź, którą chcesz pobrać, istnieje w tym pilocie:

  1. Sprawdź, git branch -rczy możesz zobaczyć tę gałąź jako gałąź śledzenia. Jeśli nie (jak w moim przypadku z pojedynczym klonem gałęzi), dodaj tę gałąź do listy gałęzi śledzenia, używając „git zdalnych zestawów gałęzi” z opcją --add:

    • git remote set-branches --add <remote_name> <branch_name>
  2. Teraz możesz pobrać konkretną gałąź (zduplikuj tutaj inne odpowiedzi):

    • git fetch <remote_name> <branch_name>
  3. I utwórz i sprawdź nową gałąź lokalną za pomocą „Checkout --track”, która otrzyma tę samą „gałąź_nazwa” jak gałąź śledzenia:

    • git checkout --track <remote_name>/<branch_name>

0

Najprostszy sposób to zrobić

  git fetch origin <branch> && git checkout <branch>

Przykład: Chcę pobrać gałąź uat z miejsca początkowego i przejść do tego jako bieżącej gałęzi roboczej.

   git fetch origin uat && git checkout uat
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.