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.

Casey Rodarmor
źródło
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 .

VonC
źródło
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
Alex Nolasco
źródło
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ł.

Frerich Raabe
źródło
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.

jkp
źródło
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
Nosaiba Darwish
źródło
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).

Casey
źródło
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.

Jitendra
źródło
8

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

$ git clone -b BRANCH_NAME --single-branch [email protected]:___/PROJECTNAME.git
Cubiczx
źródło
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>
Prem S.
źródło
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
dhS
źródło
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.

Aaron Pennington
źródło
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.

Chaitanya Vardhan
źródło
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

Aqeeb Imtiaz Harun
źródło
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.

thakis
źródło
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 !!

Tahir77667
źródło
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
Elbaz
źródło
0

git clone --branch {branch-name} {repo-URI}

Przykład: git clone --branch dev https://github.com/ann/cleaningmachine.git

an-apluss
źródło
-1

Można to zrobić w 2 krokach

  1. Sklonuj repozytorium

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

    • git checkout $BranchName
Pramod Setlur
źródło