Bagaimana cara mengkloning semua cabang jarak jauh di Git?

4129

Saya memiliki masterdan developmentcabang, keduanya didorong ke GitHub . Saya sudah cloned, pulled, dan fetched, tetapi saya tetap tidak bisa mendapatkan apa pun selain mastercabang kembali.

Saya yakin saya kehilangan sesuatu yang jelas, tetapi saya telah membaca manual dan saya tidak mendapatkan sukacita sama sekali.

Peter Coulton
sumber
133
Jawaban yang diterima di sini ( git branch -a) menunjukkan kepada Anda cabang-cabang di remote, tetapi jika Anda mencoba untuk memeriksa salah satu dari mereka, Anda akan berada dalam keadaan 'kepala terpisah'. Jawaban berikutnya turun (sebagian besar upvotes) menjawab pertanyaan yang berbeda (yaitu: bagaimana cara menarik semua cabang, dan, sekali lagi, ini hanya bekerja untuk mereka yang Anda lacak secara lokal). Beberapa komentar menunjukkan bahwa Anda dapat mem-parsing git branch -ahasil dengan skrip shell yang secara lokal akan melacak semua cabang jarak jauh. Rangkuman: Tidak ada cara asli git untuk melakukan apa yang Anda inginkan dan itu mungkin bukan ide bagus.
Hari Davis Waterbury
5
Mungkin hanya menyalin seluruh folder dengan cara lama? scp [email protected]:/home/some_user/project_folder ~Tidak yakin apakah solusi itu bekerja untuk github ..
snapfractalpop
19
Daripada mengatakan "Saya sudah mengkloning, menarik, dan mengambil," jauh lebih baik untuk menunjukkan kepada kami perintah yang tepat yang Anda jalankan.
Bob Gilmore
57
Itu selalu mengejutkan saya mengapa "klon" tidak dalam arti salinan yang tepat. Jika itu adalah tiruan yang tepat, bukankah seharusnya semua cabang menjadi bagian dari repositori lokal? Maksud saya bukankah itu salah satu poin dari distribusi? Jadi ketika repositori hilang, Anda masih memiliki salinan lengkap semuanya. Atau apakah yang disebut "remote" benar-benar sudah menjadi bagian dari repositori lokal?
huggie
21
Melihat semua upvotes, jawaban, komentar pada jawaban dan jumlah pandangan yang membingungkan, saya pikir sudah waktunya git menambahkan perintah untuk melakukan ini. Dan benar kamu @huggie, pikiranku persis.
Sнаđошƒаӽ

Jawaban:

4557

Pertama, klon repositori Git jarak jauh dan masukkan ke dalamnya:

$ git clone git://example.com/myproject
$ cd myproject

Selanjutnya, lihat cabang lokal di repositori Anda:

$ git branch
* master

Tetapi ada cabang-cabang lain yang bersembunyi di repositori Anda! Anda dapat melihat ini menggunakan -aflag:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

Jika Anda hanya ingin mengintip cabang hulu, Anda dapat memeriksanya secara langsung:

$ git checkout origin/experimental

Tetapi jika Anda ingin bekerja di cabang itu, Anda harus membuat cabang pelacakan lokal yang dilakukan secara otomatis dengan:

$ git checkout experimental

dan kamu akan lihat

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

Baris terakhir itu melempar beberapa orang: "Cabang baru" - ya? Apa artinya sebenarnya adalah bahwa cabang diambil dari indeks dan dibuat secara lokal untuk Anda. Baris sebelumnya sebenarnya lebih informatif karena memberitahu Anda bahwa cabang sedang disiapkan untuk melacak cabang jarak jauh, yang biasanya berarti cabang asal / branch_name

Sekarang, jika Anda melihat cabang lokal Anda, inilah yang akan Anda lihat:

$ git branch
* experimental
  master

Anda sebenarnya dapat melacak lebih dari satu repositori jarak jauh menggunakan git remote.

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

Pada titik ini, segalanya menjadi sangat gila, jadi lari gitkuntuk melihat apa yang terjadi:

$ gitk --all &
emk
sumber
119
Bagaimana seseorang dapat membuat secara otomatis semua cabang jarak jauh, misalnya eksperimental untuk asal / eksperimental?
Cristian Ciupitu
54
Cristian: Saya dulu selalu membuat cabang 'foo' untuk setiap 'asal / foo' cabang, tetapi ini menyebabkan dua masalah: (1) Saya akhirnya memiliki banyak cabang pelacakan yang benar-benar basi yang banyak melakukan di belakang cabang terpencil yang sesuai , dan (2) dalam versi git yang lebih lama, menjalankan 'git push' akan berusaha mendorong semua cabang lokal saya ke jarak jauh, bahkan ketika cabang-cabang itu basi. Jadi sekarang saya hanya menyimpan cabang lokal untuk hal-hal yang saya kembangkan secara aktif, dan mengakses cabang asal / * secara langsung jika saya memerlukan informasi tentangnya. (Yang mengatakan, Anda bisa menggunakan skrip shell untuk mem-parsing 'git branch -a'.)
emk
49
"git fetch <origin-name> <branch-name>" membawa cabang ke bawah secara lokal untuk Anda.
137
Jawaban bagus, tapi agak ketinggalan pertanyaan. Saya sedang mencari satu-liner untuk checkout semua cabang terpencil.
cmcginty
32
Pertanyaannya adalah tentang mengkloning semua cabang terpencil, tidak memeriksanya. Dan, seperti yang saya sebutkan di atas, Anda benar-benar tidak ingin membuat cabang pelacakan lokal lebih dari yang diperlukan, karena ketika mereka benar-benar basi, mereka dapat menyebabkan sakit kepala.
emk
822

Jika Anda memiliki banyak cabang jarak jauh yang ingin Anda ambil sekaligus, lakukan:

$ git pull --all

Sekarang Anda dapat checkout cabang apa pun yang Anda butuhkan, tanpa mengenai repositori jarak jauh.

Gabe Kopley
sumber
12
Jika saya melakukan git clone, saya memiliki cabang master lokal dan 10 cabang "jarak jauh". Jadi jawaban INI oleh Gabe sangat membantu dan menjawab pertanyaan itu.
basZero
38
ini hanya mengambil cabang remote yang telah ditambahkan secara lokal tidak setiap terpencil cabang
jujule
33
Perintah pertama adalah redundan. Cukup git pull --allakan melakukan hal yang sama - itu tidak akan mengambil dua kali. Dan infosec812 benar bahwa ini tidak menjawab pertanyaan. Saya bertanya-tanya bagaimana ini mendapat begitu banyak upvotes.
Sven Marnach
6
Setelah saya lakukan git remote update, kemudian mencoba git branch, saya hanya melihat cabang lokal. Tetapi jika saya melakukannya git branch -asaya sekarang dapat melihat cabang-cabang terpencil dan saya dapat melakukan git pull <branchname>untuk mendapatkan cabang yang saya inginkan. - Saya menerima pertanyaan ini dari pencarian Google, dan jawaban ini menyelesaikan masalah saya.
WNRosenberg
38
Ini sama sekali tidak membantu, tidak menarik cabang jauh selain yang ada.
Avinash R
446

Skrip Bash ini membantu saya:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

Ini akan membuat cabang pelacakan untuk semua cabang jarak jauh, kecuali master (yang mungkin Anda dapatkan dari perintah klon asli). Saya pikir Anda mungkin masih perlu melakukan

git fetch --all
git pull --all

untuk memastikan.

One liner : git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs
Seperti biasa: uji dalam pengaturan Anda sebelum menyalin rm -rf universe seperti yang kita kenal

Kredit untuk one-liner diberikan kepada pengguna cfi

ikan besar
sumber
19
Ini benar-benar dekat dengan menjadi solusi sempurna .. Satu-satunya hal yang akan membuatnya lebih baik adalah jika fungsi ini dibangun sebagai opsi di git.
Deven Phillips
51
"One liner": git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs Seperti biasa: uji dalam pengaturan Anda sebelum menyalinrm -rf universe as we know it
cfi
4
Perintah ini membuat cabang fitur dari jarak jauh seperti cabang normal (bukan cabang fitur) - bagaimana cara memperbaikinya?
Alex2php
4
jika Anda mengalami masalah dengan "/" dalam nama cabang ada solusi di bawah ini menggunakan alias git. lihat jawaban oleh "nobody" on "jawab 15 Mei 13 jam 11:02"
wemu
8
Saya memangkas hanya remotes/origin/untuk melestarikan ruang nama:for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done
kgadek
348

Menggunakan --mirroropsi tampaknya menyalin remotecabang pelacakan dengan benar. Namun, ini mengatur repositori sebagai repositori kosong, jadi Anda harus mengubahnya kembali menjadi repositori normal setelahnya.

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

Referensi: FAQ Git: Bagaimana saya mengkloning repositori dengan semua cabang yang dilacak dari jarak jauh?

Dave
sumber
7
Anda tahu ini sepertinya jawaban yang cukup bagus meskipun tidak memiliki suara. Apakah ada jebakan untuk melakukannya dengan cara itu? Saya harus secara eksplisit checkout cabang setelah menjalankan perintah-perintah itu.
loop
27
Ini dikombinasikan dengan git push --mirror adalah persis apa yang saya butuhkan untuk membuat duplikat persis repo git jarak jauh ketika pindah dari github.com ke instalasi perusahaan github. Terima kasih!
Jacob Fike
3
@Dave: Tambahkan final git checkoutsebagai perintah terakhir untuk akhirnya checkout kepala cabang saat ini pada repo kloning. Ini adalah jawaban yang bagus, sejauh ini yang terbaik. Berani, akhirnya kami akan membawamu ke puncak :-)
cfi
3
@Dave: Hm. Saya memiliki pemikiran kedua: - Kekerasan tidak lebih dari hanya mengatur semua cabang sebagai dilacak. Ini menyalin semua referensi dari sumber dan selanjutnya git remote updateakan melakukannya lagi. Perilaku tarik berubah. Saya kembali percaya bahwa salinan lengkap membutuhkan skrip satu baris.
cfi
5
git clone --mirrorsangat baik untuk mencadangkan repositori git Anda ^ _ ^
TrinitronX
220

Anda dapat dengan mudah beralih ke cabang tanpa menggunakan sintaks "git checkout -b somebranch origin / somebranch". Anda bisa melakukannya:

git checkout somebranch

Git secara otomatis akan melakukan hal yang benar:

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Git akan memeriksa apakah cabang dengan nama yang sama ada di persis satu remote, dan jika ya, itu melacaknya dengan cara yang sama seperti jika Anda secara eksplisit menentukan bahwa itu adalah cabang jarak jauh. Dari halaman manual git-checkout dari Git 1.8.2.1:

Jika <cabang> tidak ditemukan tetapi ada cabang pelacakan di persis satu remote (sebut saja <remote>) dengan nama yang cocok, perlakukan setara dengan

$ git checkout -b <branch> --track <remote>/<branch>
Nikos C.
sumber
1
Jadi, jika nama cabang Anda checkoutidentik dengan nama cabang jarak jauh, semuanya setelah "/", maka git akan membuat cabang dengan nama yang sama, semuanya setelah "/", "pelacakan" yang jauh ? Dan dengan pelacakan, yang kami maksud: git push, git pull, dll akan dilakukan pada remote itu? Jika ini benar, maka perluas jawaban Anda dengan informasi lebih lanjut, karena saya setuju dengan @Daniel, jawaban ini pantas mendapat lebih banyak perwakilan.
Gerard Roche
5
@BullfrogBlues, jawaban untuk semua pertanyaan Anda tampaknya ya (Saya menggunakan git v1.7.7.4). Saya setuju perilaku ini harus lebih dikenal. (Ini tidak ada dalam manual untuk versi git ini.) Sebenarnya saya tidak suka perilaku ini, saya lebih suka mendapatkan kesalahan dan harus mengatakannya git checkout --track origin/somebranchsecara eksplisit.
dubiousjim
3
@dubiousjim: Sebenarnya, ini ada di manual. git-checkout (1) mengatakan: "Jika <cabang> tidak ditemukan tetapi ada cabang pelacakan di persis satu remote (sebut saja <remote>) dengan nama yang cocok, perlakukan setara dengan 'git checkout -b <branch > --track <remote> / <branch> '"(Git V.1.8.1.1).
sleske
Yang kita butuhkan adalah $ git pull * <remote> / * - di mana "*" adalah wildcard, jadi ia menarik semua cabang, termasuk yang belum ada di sistem lokal. Bagaimana cara melakukannya? Apakah kita benar-benar harus checkout / menarik setiap cabang hanya untuk mendapatkan kode ditarik ke sistem lokal kita?
JosephK
98

Mengenai,

$ git checkout -b asal eksperimental / eksperimental

menggunakan

$ git checkout -t origin/experimental

atau lebih verbose tetapi lebih mudah diingat

$ git checkout --track origin/experimental

mungkin lebih baik, dalam hal melacak repositori jarak jauh.

murphytalk
sumber
Jadi maksud Anda bentuk kedua hanya lebih mudah diingat dan tidak ada perbedaan lain?
aderchox
79

Pengambilan yang Anda lakukan harus mendapatkan semua cabang jarak jauh, tetapi itu tidak akan membuat cabang lokal untuk mereka. Jika Anda menggunakan gitk, Anda akan melihat cabang jarak jauh yang dijelaskan sebagai "remote / origin / dev" atau yang serupa.

Untuk membuat cabang lokal berdasarkan cabang jarak jauh, lakukan sesuatu seperti:

git checkout -b ref ref / remote / origin / dev

Yang seharusnya mengembalikan sesuatu seperti:

Cabang dev diatur untuk melacak referensi / remote cabang remote / asal / dev.
Beralih ke "dev" cabang baru

Sekarang, ketika Anda berada di cabang dev, "git pull" akan memperbarui dev lokal Anda ke titik yang sama dengan cabang dev jarak jauh. Perhatikan bahwa ia akan mengambil semua cabang, tetapi hanya tarik cabang yang ada di bagian atas pohon.

Luuk Paulussen
sumber
14
Anda tidak perlu referensi / remote di sini. git checkout -b dev asal / dev akan bekerja dengan baik.
emk
3
Hal ini akan selalu bekerja: git checkout -b newlocaldev --track origin/dev. Jika Anda ingin cabang lokal memiliki nama yang sama dengan yang jauh, dan yang jauh tidak memiliki nama yang rumit, Anda dapat menghilangkan -b newlocaldev. Dengan pengaturan branch.autosetupmergekonfigurasi default , dan dengan asumsi Anda tidak memiliki cabang lokal bernama dev, kedua perintah ini dapat melakukan hal yang sama: git checkout -b dev origin/devdan hanya polos git checkout dev. Akhirnya, git checkout origin/devtidak membuat cabang baru, tetapi hanya menempatkan Anda dalam keadaan HEAD terpisah.
dubiousjim
Apa yang terjadi ketika remote tidak lagi ada tetapi Git terlalu bodoh untuk mengakui itu telah dihapus? Ini mengasumsikan Anda diperbarui dan git branch -aterus mendaftar sebagai cabang jarak jauh.
jww
Dan kami melakukan ini untuk puluhan cabang?
JosephK
59

Ketika Anda melakukan "git clone git: // location", semua cabang dan tag diambil.

Untuk bekerja di atas cabang jarak jauh tertentu, dengan asumsi itu adalah asal jarak jauh:

git checkout -b branch origin/branchname
elmarco
sumber
2
Saya menghargai catatan Anda "semua cabang dan tag diambil". Saya akan mengomentari jawaban Anda yang salah, tetapi kemudian saya memeriksanya dan ternyata Anda benar. Jadi, Anda telah memberikan jawaban terpendek - jika Anda dikloning, Anda sudah memilikinya. Bagus. Seseorang dapat mencoba menambahkan: mencoba $ git branch -abelajar, cabang-cabang terpencil apa yang sudah tersedia.
Jan Vlcinsky
Lihat jawaban yang saya posting juga. Ini mungkin berguna jika Anda tahu Anda ingin bekerja secara lokal di banyak cabang terpencil dan tidak perlu memeriksanya satu per satu.
lacostenycoder
Bisakah Anda jelaskan kepada saya apa perbedaan antara git checkout -b master origin/masterdan git checkout --track origin/mastertolong?
aderchox
1
@aderchox Saat ini, saya rasa tidak ada.
elmarco
58

Gunakan alias. Meskipun tidak ada Git satu-liner asli, Anda dapat mendefinisikannya sendiri

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

dan kemudian menggunakannya sebagai

git clone-branches
tak seorangpun
sumber
Terima kasih. Ini sebenarnya mengkloning semua cabang terpencil tidak seperti beberapa jawaban lainnya
FearlessHyena
50

Mengapa Anda hanya melihat "master"

git clonemengunduh semua cabang jarak jauh tetapi masih menganggapnya "jauh", meskipun file-file tersebut berada di repositori baru Anda. Ada satu pengecualian untuk ini, yaitu proses kloning membuat cabang lokal yang disebut "master" dari cabang jarak jauh yang disebut "master". Secara default, git branchhanya menampilkan cabang lokal, itulah sebabnya Anda hanya melihat "master".

git branch -amemperlihatkan semua cabang, termasuk cabang yang jauh .


Cara mendapatkan cabang lokal

Jika Anda benar-benar ingin bekerja di cabang, Anda mungkin menginginkan versi "lokal". Untuk hanya membuat cabang lokal dari cabang jarak jauh (tanpa memeriksanya dan dengan demikian mengubah isi direktori kerja Anda) , Anda dapat melakukannya seperti ini:

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

Dalam contoh ini, branchoneadalah nama cabang lokal yang Anda buat berdasarkan origin/branchone; jika Anda ingin membuat cabang lokal dengan nama berbeda, Anda bisa melakukan ini:

git branch localbranchname origin/branchone

Setelah membuat cabang lokal, Anda dapat melihatnya dengan git branch(ingat, Anda tidak perlu -amelihat cabang lokal).

Cerran
sumber
Jika origin/branchoneada, Anda juga bisa menggunakan git checkout branchoneuntuk membuat cabang lokal dengan nama yang sama dan mengaturnya untuk melacak jarak jauh.
Evan
47

Ini tidak terlalu rumit, langkah yang sangat sederhana dan lurus adalah sebagai berikut;

git fetch origin Ini akan membawa semua cabang jarak jauh ke lokal Anda.

git branch -a Ini akan menunjukkan semua cabang jarak jauh.

git checkout --track origin/<branch you want to checkout>

Verifikasi apakah Anda berada di cabang yang diinginkan dengan perintah berikut;

git branch

Outputnya akan seperti ini;

*your current branch 
some branch2
some branch3 

Perhatikan tanda * yang menunjukkan cabang saat ini.

Sam
sumber
1
Terima kasih suraj. Alasannya karena belum banyak dipilih. Dan ans tidak diterima oleh si penanya.
Sam
"Git fetch origin" tidak membawa cabang terpencil ke lokal saya - atau mereka disembunyikan di suatu tempat? Membaca semua jawaban di atas membuat saya sakit kepala. Kami mencari "git fetch all branch to local". Pasti ada cara selain bash-script untuk melakukan ini.
JosephK
1
Tepat setelah Anda menjalankan "git fetch origin", ia akan menampilkan output seperti ini di terminal Anda - "* [new branch] branch_name -> origin / branch_name", tetapi ketika Anda menjalankan "git branch", ia hanya akan menampilkan lokal Anda cabang sebagai gantinya, jadi untuk melihat semua cabang yang bisa Anda lakukan "git branch -a" dan kemudian untuk beralih ke cabang jauh Anda perlu menjalankan "git checkout --track origin / <branch yang ingin Anda checkout>". Semoga ini membantu. :-)
Sam
4
Suraj, karena pertanyaannya adalah, bagaimana "mengkloning semua cabang jarak jauh" - bukan bagaimana memperbarui secara manual satu per satu. Tampaknya tidak ada jawaban untuk pertanyaan aktual - hanya cara untuk melakukan banyak sekali pengetikan jika Anda memiliki banyak cabang.
JosephK
47

Lebih baik terlambat daripada tidak pernah, tetapi di sini adalah cara terbaik untuk melakukan ini:

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

Pada titik ini Anda memiliki salinan lengkap repo jarak jauh dengan semua cabangnya (verifikasi dengan git branch). Anda dapat menggunakan --mirroralih-alih --barejika repo jarak jauh Anda memiliki remote-nya sendiri.

Jacob Fike
sumber
Ada yang salah selama pengeditan di sini. Sekarang jawaban ini tidak masuk akal. " --bare" Yang disebutkan dalam kalimat terakhir tidak ada dalam daftar perintah yang diberikan.
Cerran
mengambil dari jawaban Dave di bawah ini. Menggunakan 'git config --bool core.bare false' dan bukannya 'git config unset core.bare' tampaknya melakukan pekerjaan itu.
Vorlon yang Bingung
Saya punya error: key does not contain a section: unset. Jawaban Dave bekerja lebih baik.
olibre
Ini git config --unset core.barebenar-benar ... Bagi saya, ini tampaknya solusi yang bersih dari semua disajikan dalam jawabannya di sini. Sayang sekali memiliki sedikit upvotes ...
Dirk Hillbrecht
1
Terima kasih @ ChrisSim saya setuju untuk git config --bool core.bare false. Inilah mengapa saya merekomendasikan jawaban Dave . Apa pendapat Anda tentang jawaban Dave ? Cheers
olibre
39

Lakukan ini:

$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
  master
$ git branch -a
* branchxyz
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/branchxyz
  remotes/origin/branch123

Anda lihat, 'git clone git: //example.com/myprojectt' mengambil semuanya, bahkan cabang, Anda hanya perlu checkout, lalu cabang lokal Anda akan dibuat.

rapher
sumber
25

Anda hanya perlu menggunakan "git clone" untuk mendapatkan semua cabang.

git clone <your_http_url>

Meskipun Anda hanya melihat cabang master, Anda dapat menggunakan "git branch -a" untuk melihat semua cabang.

git branch -a

Dan Anda dapat beralih ke cabang apa pun yang sudah Anda miliki.

git checkout <your_branch_name>

Jangan khawatir setelah Anda "git clone", Anda tidak perlu terhubung dengan repo jarak jauh, "git branch -a" dan "git checkout" dapat berjalan dengan sukses ketika Anda menutup wifi Anda. Jadi terbukti bahwa ketika Anda melakukan "git clone", ia sudah menyalin semua cabang dari repo jarak jauh. Setelah itu, Anda tidak perlu repo jarak jauh, lokal Anda sudah memiliki kode semua cabang.

Haimei
sumber
Responnya sangat jelas di sini. Banyak orang bingung tentang topik ini.
XMAN
Saya ingin pernyataan kedua Anda "dapat berjalan dengan sukses ketika Anda menutup wifi Anda". "git clone" benar-benar menghasilkan repo yang berisi semua cabang.
bvgheluwe
Jawaban langsung yang sangat jelas.
Amr
24

A git cloneseharusnya menyalin seluruh repositori. Coba kloning, lalu jalankan git branch -a. Seharusnya daftar semua cabang. Jika kemudian Anda ingin beralih ke cabang "foo" alih-alih "master", gunakan git checkout foo.

MattoxBeckman
sumber
1
Anda dapat menjalankan perintah git dengan atau tanpa tanda hubung. Baik "git-branch" dan "git branch" akan berfungsi.
Peter Boughton
21
Mungkin jawaban ini diberikan sejak lama ketika git bekerja secara berbeda, tapi saya pikir itu menyesatkan hari ini. git clonememang mengunduh semua cabang jarak jauh, tetapi hanya membuat cabang master lokal. Karena git branchhanya menampilkan cabang lokal, Anda perlu git branch -amelihat cabang jarak jauh juga.
Cerran
Terima kasih. Ini semacam IMO perilaku default yang aneh. Saya hanya akan menambahkannya ke saksi yang lebih samar. Jika mengunduh cabang, mengapa menyembunyikannya saat memanggil cabang git?
Adam Hughes
1
@ Serran, terima kasih; Saya telah memperbarui jawaban saya sesuai dengan itu.
MattoxBeckman
"Tidak mengunduh semua cabang jarak jauh, tetapi hanya membuat cabang master lokal". Saya perlu bantuan untuk memahami hal ini. Tampaknya git clone TIDAK mengkloning semua cabang kecuali master, seperti ketika Anda melakukan "git branch -a" itu menunjukkan bahwa "mengembangkan" cabang hanya pada "remote / asal / berkembang". Ini harus mengatakan bahwa Anda tidak memiliki cabang ini di mana pun secara lokal, hanya ada saat ini di tempat asal bukan?
John Little
19

Gunakan alat saya git_remote_branch (Anda perlu menginstal Ruby pada mesin Anda). Itu dibangun khusus untuk membuat manipulasi cabang jauh mati mudah.

Setiap kali ia melakukan operasi atas nama Anda, ia mencetaknya dengan warna merah di konsol. Seiring waktu, mereka akhirnya menempel di otak Anda :-)

Jika Anda tidak ingin grb menjalankan perintah atas nama Anda, cukup gunakan fitur 'jelaskan'. Perintah akan dicetak ke konsol Anda alih-alih dieksekusi untuk Anda.

Akhirnya, semua perintah memiliki alias, untuk memudahkan menghafal.

Perhatikan bahwa ini adalah perangkat lunak alfa ;-)

Inilah bantuan ketika Anda menjalankan bantuan grb:

git_remote_branch versi 0.2.6

  Pemakaian:

  grb buat branch_name [origin_server] 

  grb publish branch_name [origin_server] 

  grb ganti nama branch_name [origin_server] 

  grb hapus branch_name [origin_server] 

  grb track branch_name [origin_server] 



  Catatan:
  - Jika origin_server tidak ditentukan, nama 'asal' diasumsikan 
    (default git)
  - Fungsi ganti nama mengubah nama cabang saat ini

  Jelaskan meta-command: Anda juga dapat menambahkan setiap perintah dengan 
kata kunci 'jelaskan'. Alih-alih mengeksekusi perintah, git_remote_branch
hanya akan menampilkan daftar perintah yang perlu Anda jalankan untuk menyelesaikannya 
tujuan itu.

  Contoh: 
    grb jelaskan buat
    grb jelaskan buat my_branch github

  Semua perintah juga memiliki alias:
  buat: buat, baru
  hapus: hapus, hancurkan, bunuh, hapus, rm
  publish: publish, remotize
  rename: rename, rn, mv, move
  track: track, follow, grab, fetch
webmat
sumber
6
Kata bijak: Sepertinya proyek ini ditinggalkan sekitar saat jawaban ini diposting. Saya tidak dapat menemukan pembaruan setelah 2008. Kaisar peringatan dan semua itu. Jika saya salah, saya harap seseorang akan mengedit dan memberikan pointer saat ini, karena saya ingin memiliki alat seperti ini berguna.
bradheintz
@bradheintz periksa jawaban ini, ia menyiapkan alias git: stackoverflow.com/a/16563327/151841
user151841
19

semua jawaban yang saya lihat di sini valid tetapi ada cara yang jauh lebih bersih untuk mengkloning repositori dan menarik semua cabang sekaligus.

Ketika Anda mengkloning repositori, semua informasi cabang sebenarnya diunduh tetapi cabang disembunyikan. Dengan perintah itu

$ git branch -a

Anda bisa memperlihatkan semua cabang repositori, dan dengan perintah

$ git checkout -b branchname origin/branchname

Anda kemudian dapat "mengunduh" secara manual satu per satu.


Namun, ketika Anda ingin mengkloning repo dengan banyak cabang, semua cara yang diilustrasikan di atas panjang dan membosankan sehubungan dengan cara yang jauh lebih bersih dan lebih cepat yang akan saya tunjukkan, meskipun agak rumit. Anda perlu tiga langkah untuk mencapai ini:

  1. Langkah pertama

buat folder kosong baru di mesin Anda dan tiru salinan mirror dari folder .git dari repositori:

$ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
$ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git

repositori lokal di dalam folder my_repo_folder masih kosong, hanya ada folder .git tersembunyi sekarang yang bisa Anda lihat dengan perintah "ls -alt" dari terminal.

  1. Tahap kedua

alihkan repositori ini dari repositori kosong (kosong) ke repositori biasa dengan mengalihkan nilai boolean "bare" dari konfigurasi git ke false:

$ git config --bool core.bare false
  1. Langkah ketiga

Raih semua yang ada di dalam folder saat ini dan buat semua cabang pada mesin lokal, oleh karena itu buatlah ini repo yang normal.

$ git reset --hard

Jadi sekarang Anda cukup mengetik perintah "git branch" dan Anda dapat melihat bahwa semua cabang diunduh.

Ini adalah cara cepat di mana Anda dapat mengkloning git repositori dengan semua cabang sekaligus, tetapi itu bukan sesuatu yang ingin Anda lakukan untuk setiap proyek dengan cara ini.

FedericoCapaldo
sumber
Saya tidak suka Anda menggunakan kata "unduh" di ... "unduh" secara manual satu per satu . Semua info sebenarnya sudah diunduh setelah mengkloning repo. Satu-satunya hal yang perlu dilakukan adalah membuat cabang pelacakan lokal (yang juga dimungkinkan saat offline, yang membuktikan bahwa semua informasi ada di dalam repo).
bvgheluwe
@ bvgheluwe, itulah sebabnya ini dalam tanda kutip.
FedericoCapaldo
15

Kloning dari repo lokal tidak akan berfungsi dengan git clone & git fetch: banyak cabang / tag akan tetap tidak diambil.

Untuk mendapatkan klon dengan semua cabang dan tag.

git clone --mirror git://example.com/myproject myproject-local-bare-repo.git

Untuk mendapatkan klon dengan semua cabang dan tag tetapi juga dengan copy pekerjaan:

git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master
raisercostin
sumber
13

BAIK, ketika Anda mengkloning repo Anda, Anda memiliki semua cabang di sana ...

Jika Anda melakukannya git branch , mereka agak tersembunyi ...

Jadi jika Anda ingin melihat semua nama cabang, cukup tambahkan --all bendera seperti ini:

git branch --all atau git branch -a

Jika Anda hanya checkout ke cabang, Anda mendapatkan semua yang Anda butuhkan.

Tetapi bagaimana jika cabang dibuat oleh orang lain setelah Anda mengkloning?

Dalam hal ini, lakukan saja:

git fetch

dan periksa semua cabang lagi ...

Jika Anda suka mengambil dan checkout pada saat yang sama, Anda dapat melakukan:

git fetch && git checkout your_branch_name

Juga buat gambar di bawah ini untuk menyederhanakan apa yang saya katakan:

git branch --semua untuk mendapatkan semua cabang

Alireza
sumber
3
Ada perbedaan antara "Anda memilikinya" dan "Anda melihatnya". git branch -semua TIDAK akan mencantumkan cabang remote lagi ketika Anda menghapus repositori jarak jauh.
Gustave
12

Melihat salah satu jawaban untuk pertanyaan yang saya perhatikan adalah mungkin untuk mempersingkat:

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

Namun berhati-hatilah, jika salah satu cabang jarak jauh dinamai eg admin_master tidak akan diunduh!

Terima kasih kepada bigfish untuk ide orisinalnya

Tebe
sumber
Anda dapat meningkatkan regex, atau mungkin menggunakan Awk alih-alih grep, untuk meningkatkan filter untuk menghindari kesalahan positif.
tripleee
semua cabang adalah 'origin \ my_branch_name', yang tidak pasti yang saya inginkan.
Sнаđошƒаӽ
Saya belum pernah melihat konstruk $ {branch ## * /} sebelumnya - terlihat sangat berguna - ada ide di mana saya bisa mencari tahu lebih banyak tentang itu? tampaknya tidak dapat menemukan di bawah bash di mana saja. Terima kasih.
SaminOz
10

Untuk salin-tempel ke baris perintah:

git checkout master ; remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ; git checkout master

Untuk lebih mudah diingat:

git checkout master ;
remote=origin ;
for brname in `
    git branch -r | grep $remote | grep -v master | grep -v HEAD 
    | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do
    git branch -D $brname ;
    git checkout -b $brname $remote/$brname ;
done ;
git checkout master


Ini akan:

  1. lihat master (sehingga kami dapat menghapus cabang tempat kami berada)
  2. pilih remote untuk checkout (ubah ke remote apa pun yang Anda miliki)
  3. loop melalui semua cabang remote kecuali master dan HEAD
    1. hapus cabang lokal (sehingga kami dapat memeriksa cabang yang diperbarui secara paksa)
    2. periksa cabang dari jarak jauh
  4. lihat master (demi itu)

Berdasarkan jawaban dari VonC .

ikaruss
sumber
10

Saya menulis fungsi Powershell kecil ini untuk dapat mengecek semua cabang git saya, yang ada pada remote asal.

Function git-GetAllRemoteBranches {
     iex "git branch -r"                       <# get all remote branches #> `
     | % { $_ -Match "origin\/(?'name'\S+)" }  <# select only names of the branches #> `
     | % { Out-Null; $matches['name'] }        <# write does names #>
}


Function git-CheckoutAllBranches {
    git-GetAllRemoteBranches `
        | % { iex "git checkout $_" }          <# execute ' git checkout <branch>' #>
}

Lebih banyak fungsi git dapat ditemukan di repo pengaturan git saya

gringo_dave
sumber
9

Inilah jawaban yang menggunakan awk. Metode ini sudah cukup jika digunakan pada repo baru.

git branch -r | awk -F/ '{ system("git checkout " $NF) }'

Cabang yang ada hanya akan diperiksa, atau dinyatakan sudah ada di dalamnya, tetapi filter dapat ditambahkan untuk menghindari konflik.

Itu juga dapat dimodifikasi sehingga ia memanggil git checkout -b <branch> -t <remote>/<branch>perintah eksplisit .

Jawaban ini berikut Nikos C. 's ide .


Sebagai alternatif, kita dapat menentukan cabang jarak jauh sebagai gantinya. Hal ini didasarkan pada murphytalk 's jawaban .

git branch -r | awk '{ system("git checkout -t " $NF) }'

Itu melempar pesan kesalahan fatal pada konflik tapi saya lihat itu tidak berbahaya.


Kedua perintah itu bisa alias.

Menggunakan tidak ada 's jawaban sebagai referensi, kita dapat memiliki perintah berikut untuk membuat alias:

git config --global alias.clone-branches '! git branch -r | awk -F/ "{ system(\"git checkout \" \$NF) }"'
git config --global alias.clone-branches '! git branch -r | awk "{ system(\"git checkout -t \" \$NF) }"'

Secara pribadi saya akan menggunakan track-allatau track-all-branches.

konsolebox
sumber
Hanya ingin mengucapkan terima kasih. Ini bekerja dengan sempurna dan tidak menderita dari berbagai masalah yang berkaitan dengan kloning repo kosong seperti beberapa perubahan perilaku tarikan dll.
mahonya
8

Saya perlu melakukan hal yang persis sama. Ini skrip Ruby saya .

#!/usr/bin/env ruby

local = []
remote = {}

# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
  line.strip!
  if /origin\//.match(line)
     remote[line.gsub(/origin\//, '')] = line
   else
     local << line
   end
end
# Update 
remote.each_pair do |loc, rem|
  next if local.include?(loc)
  %x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]
pengguna43685
sumber
Lihat jawaban yang saya poskan lebih jauh ke bawah untuk menghindari menjalankan skrip ini sama sekali.
lacostenycoder
8

Tidak satu pun dari jawaban ini yang memotongnya, kecuali pengguna tidak ada di jalur yang benar.

Saya mengalami masalah dengan memindahkan repo dari satu server / sistem ke yang lain. Ketika saya mengkloning repo, itu hanya membuat cabang lokal untuk master jadi ketika saya mendorong ke remote baru, hanya cabang master yang didorong.

Jadi saya menemukan dua metode ini SANGAT berguna. Semoga mereka membantu orang lain.

Metode 1:

git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

Metode 2:

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo
Gaui
sumber
8

git clone --mirror pada repo asli berfungsi dengan baik untuk ini.

git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin
Bernd Jungblut
sumber
7

Git biasanya (ketika tidak ditentukan) mengambil semua cabang dan / atau tag (referensi, lihat:) git ls-refsdari satu atau lebih repositori lainnya bersama dengan objek yang diperlukan untuk melengkapi sejarahnya. Dengan kata lain, ia mengambil objek yang bisa dijangkau oleh objek yang sudah diunduh. Lihat: Apa yang git fetchsebenarnya dilakukan?

Kadang-kadang Anda mungkin memiliki cabang / tag yang tidak terhubung langsung ke yang saat ini, jadi git pull --all/ saya git fetch --alltidak akan membantu dalam hal ini, tetapi Anda dapat mendaftar dengan:

git ls-remote -h -t origin

dan ambil secara manual dengan mengetahui nama-nama referensi.

Jadi untuk mengambil semuanya , coba:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

The --depth=10000parameter dapat membantu jika Anda sudah shallowed repositori.

Kemudian periksa semua cabang Anda lagi:

git branch -avv

Jika di atas tidak membantu, Anda perlu menambahkan cabang yang hilang secara manual ke daftar yang dilacak (karena entah bagaimana tersesat):

$ git remote -v show origin
...
  Remote branches:
    master      tracked

dengan git remote set-branchessuka:

git remote set-branches --add origin missing_branch

jadi mungkin muncul di bawah remotes/originsetelah mengambil:

$ git remote -v show origin
...
  Remote branches:
    missing_branch new (next fetch will store in remotes/origin)
$ git fetch
From github.com:Foo/Bar
 * [new branch]      missing_branch -> origin/missing_branch

Penyelesaian masalah

Jika Anda masih tidak bisa mendapatkan apa pun selain cabang utama, periksa yang berikut ini:

  • Periksa ulang remote Anda ( git remote -v), mis
    • Validasi yang git config branch.master.remotemerupakan origin.
    • Periksa apakah originmenunjuk ke URL yang benar melalui: git remote show origin(lihat posting ini ).
kenorb
sumber
7

Pada awal 2017, jawaban dalam komentar ini berfungsi:

git fetch <origin-name> <branch-name>membawa cabang ke bawah untuk Anda. Meskipun ini tidak menarik semua cabang sekaligus, Anda bisa menjalankan per-cabang ini secara tunggal.

ashes999
sumber
Ini mengharuskan Anda mengambil setiap cabang satu per satu. Tidak terlalu bagus jika Anda memiliki banyak cabang.
lacostenycoder
6

Berikut ini perintah satu-liner pendek lain yang membuat cabang lokal untuk semua cabang jarak jauh:

(git branch -r | sed -n '/->/!s#^  origin/##p' && echo master) | xargs -L1 git checkout

Ini juga berfungsi dengan baik jika pelacakan cabang lokal sudah dibuat. Anda dapat memanggilnya setelah yang pertama git cloneatau beberapa saat kemudian.

Jika Anda tidak perlu mastermemeriksa cabang setelah kloning, gunakan

git branch -r | sed -n '/->/!s#^  origin/##p'| xargs -L1 git checkout
Jofel
sumber