Bagaimana cara mengkloning satu cabang di Git?

799

Saya memiliki repositori Git lokal yang disebut 'kerangka' yang saya gunakan untuk menyimpan kerangka proyek. Ini memiliki beberapa cabang, untuk berbagai jenis proyek:

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

Jika saya ingin memeriksa cabang utama untuk proyek baru, saya bisa melakukannya

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

dan semuanya seperti yang saya inginkan. Secara khusus, cabang master baru menunjuk ke cabang master kerangka, dan saya bisa mendorong dan menarik untuk bergerak di sekitar perubahan pengaturan proyek dasar.

Namun, yang tidak berhasil adalah jika saya ingin mengkloning cabang lain. Saya tidak bisa mendapatkannya sehingga saya hanya menarik cabang yang saya inginkan, misalnya railscabang, dan kemudian repositori baru memilikimaster cabang yang mendorong ke dan menarik dari cabang kerangka repositori rails, secara default.

Apakah ada cara yang baik untuk melakukan ini? Atau, mungkin ini bukan cara yang diinginkan Git agar saya menyusun berbagai hal, dan saya tentu terbuka untuk itu. Mungkin saya harus memiliki beberapa repositori, dengan repositori kerangka Ruby on Rails melacak repositori master skeleton? Dan setiap proyek individu kloning repositori kerangka Ruby on Rails.

Casey Rodarmor
sumber
Apa yang git branch -aditunjukkan?
Jakub Narębski
3
Akan git checkout -b newbranch origin/branchiwantbekerja lebih baik (tanpa --trackopsi)
VonC
3
Saya pikir apa yang Anda coba lakukan ada ide buruk. Gunakan repositori yang berbeda untuk proyek yang berbeda. Cabang adalah sesuatu yang sangat berbeda.
innaM
@Manni, saya agak memikirkan itu, karena git sepertinya tidak menyukai apa yang saya lakukan. Bisakah Anda jelaskan mengapa? Apakah itu karena cabang seharusnya tidak berumur panjang?
Casey Rodarmor
1
@ prodarmor Saya pikir apa yang Anda coba lakukan ada ide bagus, dan saya punya pertanyaan ini.
Paul Du Bois

Jawaban:

863

Catatan: git1.7.10 (April 2012) sebenarnya memungkinkan Anda untuk mengkloning hanya satu cabang :

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

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

Anda bisa melihatnya di t5500-fetch-pack.sh:

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

Tobu berkomentar bahwa:

Ini implisit ketika melakukan klon dangkal.
Ini membuat git clone --depth 1cara termudah untuk menghemat bandwidth.

Dan sejak Git 1.9.0 (Februari 2014), klon dangkal mendukung transfer data (push / pull), sehingga opsi ini bahkan lebih berguna sekarang.
Lihat lebih banyak di " Apakah git clone --depth 1(klon dangkal) lebih berguna daripada hasilnya? ".


"Membatalkan" klon dangkal dirinci pada " Konversi klon dangkal menjadi klon penuh " (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

Seperti komentar Chris :

garis ajaib untuk mendapatkan cabang yang hilang untuk dibalik --single-branchadalah (git v2.1.4):

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

Dengan Git 2.26 (Q1 2020), " git clone --recurse-submodules --single-branch" sekarang menggunakan opsi cabang tunggal yang sama ketika mengkloning submodul .

Lihat komit 132f600 , komit 4731957 (21 Feb 2020) oleh Emily Shaffer ( nasamuffin) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam commit b22db26 , 05 Mar 2020)

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

Ditandatangani oleh: Emily Shaffer
Acked-oleh: Jeff King

Sebelumnya, melakukan "git clone --recurse-submodules --single-branch " menghasilkan submodula mengkloning semua cabang meskipun proyek super hanya mengkloning satu cabang.

Pipa --single-branchmelalui kerangka pembantu submodule untuk membuatnya ke ' clone' nanti.

VONC
sumber
80
git clone <url> --branch <branch> --single-branch <folder>bekerja seperti pesona.
Alexander
1
Yup, saya pikir sudah waktunya untuk memperbarui jawaban yang diterima :) Ini tidak "berfungsi seperti pesona"
kumarharsh
5
Juga, ini tersirat saat melakukan klon dangkal. Ini membuat clone --depth 1cara termudah untuk menghemat bandwidth.
Tobu
1
@Tobu dan VonC --depth 1tidak aman bagi pengguna karena mereka mungkin ingin benar-benar mendorong / menarik dengan klon baru.
nmr
2
Hanya untuk menjelaskan koreksi Peter Cordes secara penuh, garis ajaib untuk mendapatkan cabang yang hilang untuk dibalik --single-branchadalah git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*dan git fetch --unshallow(git v2.1.4)
Chris
670

Salah satu caranya adalah dengan menjalankan yang berikut ini.

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

Dimana branch_name cabang pilihan Anda dan "/ folder Anda" adalah folder tujuan untuk cabang itu. Memang benar bahwa ini akan membawa cabang lain memberi Anda kesempatan untuk bergabung bolak-balik.

Memperbarui

Sekarang, dimulai dengan Git 1.7.10, sekarang Anda dapat melakukan ini

git clone user@git-server:project_name.git -b branch_name --single-branch /your/folder
Alex Nolasco
sumber
36
Ini berfungsi, tetapi mengambil semua cabang. Lihat @ frerich = jawaban raabe di bawah ini.
cdunn2001
3
Terimakasih. hanya tambahkan "-b branch_name" dalam kasus saya. Itu menyelamatkan saya banyak waktu.
PhatHV
Ya itu bekerja dengan sempurna ...! Saya lebih dari orang TFS dan untuk proyek pribadi saya telah menggunakan git. Salah bercabang git, saya melakukannya dengan cara yang salah sebelumnya dan senang mengetahui metode mudah ini dan tampaknya sempurna! Terima kasih lagi! Sudah memberi +1, jika mungkin saya akan memberikan +100 :)
k25
11
Anda juga dapat menambahkan --single-branchuntuk mengambil hanya sejarah yang terkait dengan cabang ini alih-alih semua riwayat & tag yang berisi repositori.
flawyte
1
@AlexNolasco Bisakah Anda mengedit jawaban yang mengatakan apa / folder / ? Terima kasih
Nabin
112

Menggunakan Git versi 1.7.3.1 (pada Windows), inilah yang saya lakukan ( $BRANCHadalah nama cabang yang ingin saya checkout dan $REMOTE_REPOmerupakan URL repositori jarak jauh yang ingin saya klon dari):

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

Keuntungan dari pendekatan ini adalah bahwa panggilan berikutnya git pull(atau git fetch) juga hanya akan mengunduh cabang yang diminta.

Frerich Raabe
sumber
Apa perbedaan antara skrip Anda dan baris ini? git clone -b $BRANCH $REMOTE_REPO $BRANCHafik mereka sama?
Ian Vaughan
12
@Ian: Satu perbedaan adalah git clone -bmemberi Anda semua referensi jarak jauh (semua cabang dan tag jarak jauh) sebagai git branch -apertunjukan. Dengan skrip saya, Anda hanya mendapatkan satu referensi.
Frerich Raabe
1
Ketika saya mencoba yang di atas (katakanlah dengan $ BRANCH = "nick"), saya mendapatkan 'fatal: Tidak dapat menemukan referensi / kepala / nick remote. Tampaknya tidak bekerja untuk saya ...
Nick
3
Catatan yang -t $BRANCHberfungsi bahkan tanpa -f, yang akan langsung diambil. Kemudian, git fetch originakan mengambil, dan git checkout $BRANCHakan mendirikan cabang lokal dan checkout. Itu berguna ketika Anda perlu mengkonfigurasi remote sebelum mengambil, misalnya git config remote.origin.uploadpack=/bin/upload-pack.
cdunn2001
1
Karena saya menggunakan corporate git "lama" (1.6.0.2), saya terikat dengan solusi di atas. Saya memiliki masalah yang sama dengan @Nick. Exit git branch -amenunjukkan origin/$BRANCH. Melakukan git checkout origin/$BRANCHperbaikan ini.
dr jerry
30

Anda dapat mencoba cara lama:

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

Apa yang dilakukan adalah:

  • Buat dan init repositori Git kosong.
  • Menambahkan repositori asli sebagai asal yang disebut remote .
  • Hanya mengambil cabang yang Anda butuhkan dari asal yang disebut remote .
  • Membuat dan memeriksa cabang baru yang diatur untuk melacak cabang sumber yang baru saja Anda kloning.

Semoga itu akan menjadi seperti apa yang Anda cari.

jkp
sumber
Argumen untuk git add remote ditukar, tetapi saya tidak bisa mendapatkan checkout untuk bekerja. "git checkout origin / rails" give me "error: pathspec 'origin / rails' tidak cocok dengan file apa pun yang dikenal git." dan alternatifnya memberi saya "fatal: git checkout: memperbarui jalur tidak kompatibel dengan beralih cabang."
Casey Rodarmor
@rodarmor: telah memperbaiki perintah git remote, terima kasih. Bisakah Anda menempelkan output git branch -r?
jkp
@ jkp, Sebenarnya git branch -rtidak memberikan output.
Casey Rodarmor
@ prodarmor: Saya sudah mengoreksi contoh dan ini pasti berhasil (diuji). HTH (Anda dapat menerimanya begitu diuji, Anda suka;))
jkp
saklar -b relatif baru. Terakhir kali saya menjalankannya pada debian squeeze, itu tidak tersedia, IIRC
sehe
23

Anda dapat melakukannya dengan menggunakan perintah di bawah ini:

git clone -b branch_name --single-branch project_url local_folder_to_clone_in
nosaiba darwish
sumber
2
Bekerja dengan sempurna, saya benar-benar memiliki masalah di Source Tree untuk mengkloning satu cabang, sehingga melakukannya secara manual
azhar22k
17

Dari halaman manual git-clone :

--single-branchadalah teman Anda selama klon ingat untuk menggunakan dengan --branch <branch name>atau hanya HEAD primer jarak jauh yang akan dikloning (master secara default)

Selalu ingat untuk melakukan Ctrl+ F5membaca sumber baru, bukan yang dari cache :-) (Saya tidak begitu tahu tentang opsi ini untuk waktu yang lama.)

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

Cukup masukkan URL dan nama cabang.

Jitendra
sumber
8

Klon hanya satu cabang. Ini cara termudah:

$ git clone -b BRANCH_NAME --single-branch [email protected]:___/PROJECTNAME.git
Cubiczx
sumber
4

Untuk mengkloning cabang tertentu yang dapat Anda lakukan:

git clone --branch yourBranchName [email protected]

nPcomp
sumber
3

Untuk mengkloning cabang Git Anda tidak memiliki kunci publik untuk, gunakan ini:

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>
Prem S
sumber
2

Buka cmd.

cd folder_name (masukkan jalur tempat mengkloning cabang)

Hanya satu perintah:

git clone url_of_projecturltoclone -b branch_name
dhS
sumber
2

Sedikit terlambat tetapi saya ingin menambahkan solusi yang saya gunakan untuk menyelesaikan masalah ini. Saya menemukan solusinya di sini .

Ngomong-ngomong, pertanyaannya sepertinya bertanya 'bagaimana memulai proyek baru dari cabang repo lain?'

Untuk ini, solusi yang saya gunakan adalah membuat repo baru di github atau di mana pun. Ini akan berfungsi sebagai repo untuk proyek baru Anda.

Di mesin lokal Anda, navigasikan ke proyek yang memiliki cabang yang ingin Anda gunakan sebagai templat untuk proyek baru Anda.

Jalankan perintah:

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

Apa yang akan dilakukan adalah mendorong old_branch ke new-repo dan menjadikannya cabang utama dari repo baru.

Anda kemudian hanya perlu mengkloning repo baru ke direktori lokal proyek baru Anda dan Anda memiliki proyek baru dimulai di cabang lama.

Aaron Pennington
sumber
2

Mari kita ambil contoh repo termos. Ini memiliki 3 cabang selain master. Mari kita periksa cabang jarak jauh 1.1.x

mengkloning git repo

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

cd ke repo.

cd flask

ambil cabang jarak jauh 1.1.x

git fetch origin 1.1.x

checkout cabang

git checkout 1.1.x

Anda akan beralih ke cabang 1.1.x dan akan melacak cabang 1.1.x jauh.

Chaitanya Vardhan
sumber
0

Mirip dengan apa yang dikatakan @ nosaiba-darwish di sini: di sini

Inilah yang biasanya kami lakukan di perusahaan kami:

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

Aqeeb Imtiaz Harun
sumber
0

Jika Anda ingin klon dangkal, Anda dapat melakukan ini dengan:

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

--depth=1tersirat --single-branch.

thakis
sumber
0

Ada 2 solusi utama untuk ini:

  1. Anda perlu menentukan nama cabang dengan saklar perintah -b. Berikut adalah sintaks dari perintah untuk mengkloning cabang git tertentu.

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

Contoh: git clone -b tahir https://github.com/Repository/Project.git

Perintah berikut akan mengkloning tahir cabang dari repositori git. Perintah di atas hanya mengkloning cabang tertentu tetapi mengambil detail cabang lain. Anda dapat melihat semua detail cabang dengan perintah. git branch -a

  1. Anda dapat menggunakan flag '--single-branch' untuk mencegah pengambilan detail dari cabang lain seperti di bawah ini:

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

Contoh: git clone -b tahir --single-branch https://github.com/Repository/Project.git

Sekarang jika Anda melakukan git branch -a, itu hanya akan menunjukkan cabang tunggal Anda saat ini yang telah Anda kloning dan tidak semua cabang. Jadi itu tergantung pada Anda bagaimana Anda menginginkannya.

Semoga ini bisa membantu seseorang suatu hari !! ...

Tahir77667
sumber
0

Anda dapat menggunakan perintah ini untuk membuka cabang tunggal dan mengganti nama folder jika Anda ingin tetap bercabang sendirian

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

contoh

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

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

Contoh: git clone --branch dev https://github.com/ann/cleaningmachine.git

an-apluss
sumber
-1

Dapat dilakukan dalam 2 langkah

  1. Kloning repositori

    • git clone <http url>
  2. Periksa cabang yang Anda inginkan

    • git checkout $BranchName
Pramod Setlur
sumber