Jak sklonować pojedynczy oddział w Git?


799

Mam lokalne repozytorium Git o nazwie „szkielet”, którego używam do przechowywania szkieletów projektu. Ma kilka oddziałów dla różnych rodzajów projektów:

casey@agave [~/Projects/skeleton] git branch
* master
  rails
  c
  c++

Jeśli chcę sprawdzić gałąź główną nowego projektu, mogę to zrobić

casey@agave [~/Projects] git clone skeleton new
Initialized empty Git repository in /Users/casey/Projects/new/.git/

i wszystko jest tak, jak tego chcę. W szczególności nowa gałąź główna wskazuje szkieletową gałąź główną, a ja mogę naciskać i ciągnąć, aby zmieniać zmiany w podstawowej konfiguracji projektu.

Jednak to, co nie działa, to jeśli chcę sklonować inną gałąź. Nie mogę go pobrać, więc wyciągam tylko gałąź, którą chcę, na przykład railsgałąź, a następnie nowe repozytorium ma mastergałąź, która railsdomyślnie odpycha i pobiera z gałęzi repozytorium szkieletu .

Czy istnieje dobry sposób, aby to zrobić? A może to nie w ten sposób Git chce, żebym ustrukturyzował różne rzeczy i jestem z pewnością otwarty na to. Może powinienem mieć wiele repozytoriów, a repozytorium szkieletu Ruby on Rails śledzi repozytorium szkieletu głównego? I każdy indywidualny projekt klonujący repozytorium szkieletu Ruby on Rails.


Co git branch -apokazuje
Jakub Narębski

3
Czy git checkout -b newbranch origin/branchiwantdziałałoby lepiej? (bez --trackopcji)
VonC

3
Myślę, że to, co próbujesz zrobić, to zły pomysł. Używaj różnych repozytoriów dla różnych projektów. Gałęzie są czymś zupełnie innym.
innaM

@Manni, myślałem, że skoro gitowi nie podobało się to, co robię. Czy możesz mi wytłumaczyć dlaczego? Czy to dlatego, że gałęzie nie powinny długo żyć?
Casey Rodarmor

1
@rodarmor Myślę, że to, co próbujesz zrobić, to dobry pomysł i miałem dokładnie to pytanie.
Paul Du Bois

Odpowiedzi:


863

Uwaga: git1.7.10 (kwiecień 2012 r.) Umożliwia klonowanie tylko jednej gałęzi :

# clone only the remote primary HEAD (default: origin/master)
git clone --single-branch

as in:
git clone <url> --branch <branch> --single-branch [<folder>]

Możesz to zobaczyć w t5500-fetch-pack.sh:

test_expect_success 'single branch clone' '
  git clone --single-branch "file://$(pwd)/." singlebranch
'

Tobu komentuje, że:

Jest to domniemane, gdy wykonuje się płytki klon.
To git clone --depth 1najprostszy sposób na zaoszczędzenie przepustowości.

Od wersji Git 1.9.0 (luty 2014 r.) Płytkie klony obsługują przesyłanie danych (push / pull), więc ta opcja jest teraz jeszcze bardziej przydatna.
Zobacz więcej w „ Czy git clone --depth 1(płytki klon) jest bardziej użyteczny niż się wydaje? ”.


„Cofanie” płytkiego klonu opisano w „ Konwertowaniu płytkiego klonu na pełny klon ” (git 1.8.3+)

# unshallow the current branch
git fetch --unshallow

# for getting back all the branches (see Peter Cordes' comment)
git config remote.origin.fetch refs/heads/*:refs/remotes/origin/*
git fetch --unshallow

Jak komentuje Chris :

magiczna linia odwracania brakujących gałęzi --single-branchto (git v2.1.4):

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

W przypadku Git 2.26 (Q1 2020) „ git clone --recurse-submodules --single-branchużywa teraz tej samej opcji pojedynczego odgałęzienia podczas klonowania submodułów .

Zobacz zatwierdzenie 132f600 , zatwierdzenie 4731957 (21 lutego 2020 r.) Przez Emily Shaffer ( nasamuffin) .
(Połączone przez Junio ​​C Hamano - gitster- w commit b22db26 , 05 marca 2020)

clone: pass --single-branch podczas --recurse-submodules

Podpisano: Emily Shaffer
Przypisano: Jeff King

Poprzednio wykonanie „ git clone --recurse-submodules --single-branch” powodowało klonowanie wszystkich gałęzi przez podmoduły, mimo że superprojekt sklonował tylko jedną gałąź.

Przeprowadź --single-branchprzez podmodulową strukturę pomocniczą, aby clonepóźniej przejść do .


80
git clone <url> --branch <branch> --single-branch <folder>działa jak marzenie.
Alexander

1
Tak, myślę, że nadszedł czas, aby zaktualizować zaakceptowaną odpowiedź :) To działa „działa jak urok”
kumarharsh

5
Jest to również domniemane, gdy wykonuje się płytki klon. To clone --depth 1najprostszy sposób na zaoszczędzenie przepustowości.
Tobu,

1
@Tobu i VonC --depth 1są niebezpieczne dla użytkownika, ponieważ mogą chcieć faktycznie pchać / ciągnąć za pomocą nowego klonu.
nmr

2
Wystarczy, aby przeliterować korektę Peter Cordes' w całości, linia magia uzyskania brakujących gałęzie, aby odwrócić --single-branchsię git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*i git fetch --unshallow(git V2.1.4)
Chris

670

Jednym ze sposobów jest wykonanie następujących czynności.

git clone user@git-server:project_name.git -b branch_name /your/folder

Gdzie branch_namejest wybrana gałąź, a „/ your / folder” to folder docelowy dla tej gałęzi. To prawda, że ​​przyniesie to inne gałęzie, dając ci możliwość łączenia się tam i z powrotem.

Aktualizacja

Teraz, począwszy od Git 1.7.10, możesz teraz to zrobić

git clone user@git-server:project_name.git -b branch_name --single-branch /your/folder

36
To działa, ale pobiera wszystkie gałęzie. Zobacz odpowiedź @ frerich = raabe poniżej.
cdunn2001

3
Dzięki Ci. dodaj tylko „-b nazwa_gałęzi” w moim przypadku. Oszczędzało mi to dużo czasu.
PhatHV

Tak, działa idealnie ...! Jestem bardziej osobą TFS i do moich osobistych projektów używam git. Wrto git rozgałęzienie, robiłem to wcześniej źle i dobrze jest znać tę łatwą metodę i wydaje się idealna! Dzięki jeszcze raz! Już
dawałem

11
Możesz także dodać, --single-branchaby pobrać tylko historię powiązaną z tą gałęzią zamiast całej historii i tagów zawartych w repozytorium.
flawyte

1
@AlexNolasco Czy możesz edytować odpowiedź, mówiąc, co to jest / some / folder ? Dziękuję
Nabin

112

Korzystając z Git w wersji 1.7.3.1 (w systemie Windows), oto co robię ( $BRANCHto nazwa gałęzi, którą chcę pobrać i $REMOTE_REPOjest to adres URL zdalnego repozytorium, z którego chcę sklonować):

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH

Zaletą tego podejścia jest to, że kolejne git pull(lub git fetch) połączenia będą również pobierać żądany oddział.


Czym różni się twój skrypt od tego wiersza? git clone -b $BRANCH $REMOTE_REPO $BRANCHafik są takie same?
Ian Vaughan

12
@Ian: Jedną różnicą jest to, że dajesz git clone -bwszystkie zdalne referencje (wszystkie zdalne gałęzie i tagi) jako git branch -apokazy. Z moim skryptem dostajesz tylko jeden ref.
Frerich Raabe

1
Gdy wypróbuję powyższe (powiedzmy za pomocą $ BRANCH = "nick"), otrzymuję komunikat „fatal: Nie mogłem znaleźć zdalnych referencji / heads / nick”. Wydaje się, że to nie działa dla mnie ...
Nick

3
Pamiętaj, że -t $BRANCHdziała nawet bez niego -f, co można pobrać natychmiast. Następnie git fetch originpobierałby i git checkout $BRANCHtworzył lokalny oddział i kasę. Jest to przydatne, gdy trzeba skonfigurować pilota przed pobraniem, np git config remote.origin.uploadpack=/bin/upload-pack.
cdunn2001

1
Ponieważ jestem na „starym” korporacyjnym gicie (1.6.0.2), jestem zobowiązany do powyższego rozwiązania. Miałem taki sam problem jak @Nick. Wykonanie git branch -apokazane origin/$BRANCH. Robi git checkout origin/$BRANCHstałe to.
dr jerry

30

Możesz wypróbować długą drogę:

mkdir newrepo.git
cd newrepo.git
git init
git remote add origin file:///path/to/original
git fetch origin branchiwant:refs/remotes/origin/branchiwant
git checkout -b branchiwant --track origin/branchiwant

To robi:

  • Utwórz i zainicjuj puste repozytorium Git.
  • Dodaje oryginalne repozytorium jako zdalne o nazwie origin .
  • Pobiera tylko żądaną gałąź ze zdalnego o nazwie origin .
  • Tworzy i sprawdza nową gałąź skonfigurowaną do śledzenia sklonowanej gałęzi źródłowej.

Mam nadzieję, że będzie to coś, czego szukasz.


Argumenty do dodania git zdalnego zostały zamienione, ale nie mogłem wtedy uruchomić kasy do pracy. Błąd „git checkout origin / rails” dał mi błąd: pathspec „origin / rails” nie pasuje do żadnego pliku (ów) znanego git. ” a alternatywa dała mi „fatal: git checkout: aktualizacja ścieżek jest niezgodna z przełączaniem gałęzi”.
Casey Rodarmor

@rodarmor: poprawiono polecenie git remote, dzięki. Czy możesz wkleić wynik git branch -r?
jkp

@jkp, faktycznie git branch -rnie daje danych wyjściowych.
Casey Rodarmor

@rodarmor: Poprawiłem przykład i to zdecydowanie działa (przetestowane). HTH (możesz to zaakceptować po przetestowaniu, który ci się podoba;))
jkp

przełącznik -b jest stosunkowo nowy. Ostatni raz, kiedy prowadził go na Debian Squeeze nie był dostępny, IIRC
sehe

23

Możesz to zrobić za pomocą poniższego polecenia:

git clone -b branch_name --single-branch project_url local_folder_to_clone_in

2
Działa idealnie, faktycznie miałem problem z drzewem źródłowym, aby sklonować jedną gałąź, więc zrobiłem to ręcznie
azhar22k 30.01.2017

17

Ze strony podręcznika git-clone :

--single-branchczy twój przyjaciel podczas klonowania pamiętaj o używaniu go, --branch <branch name>czy klonowany będzie tylko zdalny główny HEAD (domyślnie master)

Zawsze pamiętaj, aby zrobić Ctrl+, F5aby przeczytać świeże źródło, nie ten z pamięci podręcznej :-) (długo nie wiedziałem o tej opcji).


1
git clone <url> --branch <branch> --single-branch <folder>
shridutt kothari

17
git clone <url> --branch <branch> --single-branch

Wystarczy wpisać adres URL i nazwę oddziału.


8

Sklonuj tylko jedną gałąź. To najprostszy sposób:

$ git clone -b BRANCH_NAME --single-branch git@bitbucket.org:___/PROJECTNAME.git

4

Do klonowania określonej gałęzi możesz:

git clone --branch yourBranchName git@yourRepository.git


3

Do klonowania gałęzi Git, do której nie masz klucza publicznego, użyj tego:

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>

2

Otwórz cmd.

cd folder_name (wprowadź ścieżkę do sklonowania gałęzi)

Tylko jedno polecenie:

git clone url_of_projecturltoclone -b branch_name

2

Trochę późno, ale chciałem dodać rozwiązanie, którego użyłem do rozwiązania tego problemu. Tutaj znalazłem rozwiązanie .

W każdym razie wydaje się, że pytanie brzmi „jak rozpocząć nowy projekt z oddziału innego repo?”.

W tym celu zastosowałem rozwiązanie polegające na utworzeniu nowego repo w github lub gdziekolwiek. Będzie to służyć jako repozytorium do nowego projektu.

Na komputerze lokalnym przejdź do projektu, który ma gałąź, której chcesz użyć jako szablonu dla nowego projektu.

Uruchom polecenie:

git push https://github.com/accountname/new-repo.git +old_branch:master

Spowoduje to przeniesienie old_branch do new-repo i uczynienie z niego gałęzi master nowego repo.

Następnie wystarczy sklonować nowe repozytorium do lokalnego katalogu nowego projektu i nowy projekt rozpoczął się w starym oddziale.


2

Weźmy przykład repozytorium kolby. Ma 3 gałęzie oprócz master. Sprawdźmy zdalną gałąź 1.1.x.

sklonuj repozytorium git

git clone https://github.com/pallets/flask

cd do repozytorium.

cd flask

pobierz zdalną gałąź 1.1.x

git fetch origin 1.1.x

sprawdź oddział

git checkout 1.1.x

Nastąpi przejście do gałęzi 1.1.x, która będzie śledzić zdalną gałąź 1.1.x.


0

Podobne do tego, co powiedział @ nosaiba-darwish tutaj: tutaj

Tak zwykle robimy w naszej firmie:

git clone -b <name_of_branch> --single-branch <git_url> folder_to_clone_locally


0

Jeśli chcesz mieć płytkiego klona, ​​możesz to zrobić za pomocą:

git clone -b mybranch --depth=1 https://example.com/myproject.git localname

--depth=1implikuje --single-branch.


0

Są na to przede wszystkim 2 rozwiązania:

  1. Musisz podać nazwę gałęzi za pomocą przełącznika polecenia -b. Oto składnia polecenia sklonowania określonej gałęzi git.

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

Przykład: git clone -b tahir https://github.com/Repository/Project.git

Następujące polecenie sklonuje gałąź tahir z repozytorium git. Powyższe polecenie klonuje tylko określoną gałąź, ale pobiera szczegóły innych gałęzi. Możesz wyświetlić szczegóły wszystkich gałęzi za pomocą polecenia. git branch -a

  1. Możesz użyć flagi „--single-branch”, aby zapobiec pobieraniu szczegółów innych gałęzi, takich jak poniżej:

git clone -b <BRANCH_NAME> --single-branch <GIT_REMOTE_URL>

Przykład: git clone -b tahir --single-branch https://github.com/Repository/Project.git

Teraz, jeśli zrobisz git branch -a , pokaże tylko bieżącą pojedynczą gałąź, którą sklonowałeś, a nie wszystkie gałęzie, więc to zależy od ciebie, jak chcesz.

Mam nadzieję, że kiedyś komuś pomoże !!


0

możesz użyć tego polecenia, aby uzyskać pojedynczy oddział i zmienić nazwę folderu, jeśli chcesz pozostawić rozgałęziony autonomiczny

git clone -b [branch-name] --single-branch [url]  [folder_name]

przykład

git clone -b mybranch --single-branch git://github/repository.git  project_mybranch


-1

Można to zrobić w 2 krokach

  1. Sklonuj repozytorium

    • git clone <http url>
  2. Kasa, którą chcesz

    • git checkout $BranchName
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.