Cara mengambil semua cabang Git


1507

Saya mengkloning repositori Git, yang berisi sekitar lima cabang. Namun, ketika saya melakukannya git branchsaya hanya melihat salah satunya:

$ git branch
* master

Saya tahu bahwa saya dapat melakukan git branch -auntuk melihat semua cabang, tetapi bagaimana saya menarik semua cabang secara lokal sehingga ketika saya melakukannya git branch, ini menunjukkan yang berikut?

$ git branch
* master
* staging
* etc...


2
Pertanyaan ini menunjukkan cara mendapatkan semua cabang setelah menggunakan --single-branchpengaturan saat kloning: stackoverflow.com/questions/17714159/… ( git fetch --alltidak akan pernah berfungsi jika Anda hanya menetapkan satu cabang!)
Matthew Wilcoxson

2
Anda tidak akan melihat output itu selamanya karena tanda bintang mewakili cabang yang sedang keluar. Karena Anda hanya dapat memeriksa satu cabang sekaligus, Anda hanya dapat memiliki satu tanda bintang di sebelah kiri daftar cabang Anda.
Robino

5
Saya melihat banyak jawaban tetapi tidak satupun dari mereka menyebutkan apa yang saya pikir mungkin merupakan cara termudah untuk melakukan apa yang Anda inginkan: git clone --bare <repo url> .git (perhatikan Anda perlu menambahkan "--bare" dan ".git" pada akhirnya untuk mengkloning repo sebagai "bare" repo), lalu git config --bool core.bare false(setel flag "bare" menjadi false), lalu git reset --hard(pindahkan HEAD ke HEAD saat ini pada repo). Sekarang jika Anda git branchharus melihat semua cabang dari repo yang Anda kloning.
Gabriel Ferraz

4
@GabrielFerraz Kemudian Anda menyalahgunakan fungsi komentar di Stack Overflow. Pengguna dapat meningkatkan komentar Anda tetapi tidak downvote.
pipa

Jawaban:


2051

Anda dapat mengambil semua cabang dari semua remote seperti ini:

git fetch --all

Ini pada dasarnya adalah langkah kekuatan .

fetchmemperbarui salinan lokal dari cabang jarak jauh sehingga ini selalu aman untuk cabang lokal Anda TETAPI :

  1. fetchtidak akan memperbarui cabang lokal (yang melacak cabang jarak jauh); jika Anda ingin memperbarui cabang lokal Anda, Anda masih perlu menarik setiap cabang.

  2. fetchtidak akan membuat cabang lokal (yang melacak cabang jarak jauh), Anda harus melakukan ini secara manual. Jika Anda ingin mendaftar semua cabang jarak jauh: git branch -a

Untuk memperbarui cabang lokal yang melacak cabang jarak jauh:

git pull --all

Namun, ini masih belum cukup. Ini hanya akan berfungsi untuk cabang lokal Anda yang melacak cabang jarak jauh. Untuk melacak semua cabang jarak jauh, jalankan oneliner ini SEBELUM git pull --all :

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

TL; versi DR

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

(Tampaknya menarik mengambil semua cabang dari semua remote, tapi saya selalu mengambil pertama hanya untuk memastikan.)

Jalankan perintah pertama hanya jika ada cabang jauh di server yang tidak dilacak oleh cabang lokal Anda.

PS AFAIK git fetch --alldan git remote updatesetara.



Kamil Szot ini komentar yang orang telah ditemukan berguna.

Saya harus menggunakan:

for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done

karena kode Anda membuat cabang lokal bernama origin/branchnamedan saya mendapatkan "refname 'origin / branchname' ambigu setiap kali saya menyebutnya.


42
Maaf. Saya tidak dapat membayangkan bahwa inilah yang sebenarnya diinginkan OP. Perintah 'pull' adalah 'fetch + merge' dan bagian gabungan akan menimpa semua cabang di atas satu sama lain - meninggalkan satu kekacauan besar.
GoZoner

10
pengambilan itu tidak akan membuat cabang jarak jauh baru yang masih harus Anda periksagit checkout -b localname remotename/remotebranch
Learath2

125
Saya harus menggunakan for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done karena kode Anda membuat cabang lokal bernama origin / branchname dan saya mendapatkan "refname 'origin / branchname' ambigu setiap kali saya menyebutnya
Kamil Szot

22
Saya tidak tahu apakah saya menggunakan versi GIT yang berbeda, tetapi saya harus mengubah skripnya git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done. Perubahan menghapus KEPALA.
kim3er

16
Untuk orang-orang Windows:for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
Max

719

Untuk membuat daftar cabang jarak jauh:
git branch -r

Anda dapat memeriksanya sebagai cabang lokal dengan:
git checkout -b LocalName origin/remotebranchname


88
Ini persis apa yang saya cari ketika saya menemukan pertanyaan di atas. Saya menduga banyak orang mencari cara menarik cabang jauh pasti tidak ingin menggabungkan cabang ke copy pekerjaan mereka saat ini, tetapi mereka ingin cabang lokal identik dengan yang jauh.
Frug

12
Bahkan jika cabang tidak terlihat secara lokal, saya bisa melakukannya git checkout remotebranchnamedan berfungsi. apa bedanya dengan solusi Anda?
François Romain

12
Perilaku defaultnya sekarang. Tidak demikian halnya dengan versi git yang lebih lama. Menggunakan git checkout remotebranchnamedigunakan untuk hanya membuat cabang baru yang tidak terkait yang bernama remotebranchname .
Learath2

12
Jawaban yang diterima melakukan sesuatu yang berbeda secara fundamental dan terus terang saya bahkan tidak mengerti mengapa ini jawaban yang diterima
Learath2

8
OP meminta semua cabang. Jawaban ini hanya ada satu.
Ted Bigham

193

Anda harus membuat cabang lokal yang melacak cabang jarak jauh.

Dengan asumsi bahwa Anda hanya memiliki satu panggilan jarak jauh origin, cuplikan ini akan membuat cabang lokal untuk semua yang pelacakan jarak jauh:

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Setelah itu, git fetch --allakan memperbarui semua salinan lokal cabang jauh.

Juga, git pull --allakan memperbarui cabang pelacakan lokal Anda, tetapi tergantung pada komit lokal Anda dan bagaimana opsi konfigurasi 'gabungan' diatur, itu mungkin membuat komit gabungan, maju-cepat atau gagal.


5
Ini menguatkan solusi terhadap nama-nama cabang yang mengandung metakarakter shell (sesuai komentar pinkeen pada jawaban lainnya), dan menghindari output kesalahan palsu: git branch -r | grep -v - '->' | saat membaca jarak jauh; do git branch --track "$ {remote # origin /}" "$ remote" 2> & 1 | grep -v 'sudah ada'; selesai
Daira Hopwood

6
Apakah Anda yakin git pull --allakan memperbarui semua cabang pelacakan lokal? Sejauh yang saya tahu itu hanya memperbarui cabang saat ini dari semua remote.
Andy

3
Lakukan ini. Cabang lokal yang cocok dengan cabang jarak jauh tidak dibuat. Apa perintah git yang hanya mengatakan "tarik semua cabang jarak jauh membuat yang lokal jika mereka tidak ada?"
JosephK

@ JosephK mungkin remote Anda tidak dipanggil origin? Lihat jawaban ini yang akan berfungsi pada semua nama jarak jauh.
Tom Hale

@ TomHale Itu "asal," tapi terima kasih atas jawaban Anda - meskipun gila bahwa banyak yang diperlukan untuk melakukan apa yang seharusnya menjadi satu atau mungkin dua bendera. Sekarang saya mencoba gitless, untuk menghindari kegilaan dari beberapa aspek git.
JosephK

116

Jika kamu melakukan:

git fetch origin

maka mereka semua akan ada di sana secara lokal. Jika Anda melakukan:

git branch -a

Anda akan melihat mereka terdaftar sebagai remote / asal / nama-cabang. Karena mereka ada di sana secara lokal Anda dapat melakukan apa pun yang Anda suka dengan mereka. Sebagai contoh:

git diff origin/branch-name 

atau

git merge origin/branch-name

atau

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

5
Baru saja menemukan halaman ini di google ... ini adalah jenis jawaban yang sebenarnya saya cari. Saya mencoba perintah pertama tetapi menerima kesalahan: [$ git fetch - semua asal fatal: fetch - semua tidak mengambil argumen repositori] --- Menggunakan "git fetch --all" sepertinya melakukan trik. Terima kasih atas petunjuknya!
longda

1
Diperbaiki (dihilangkan --all)
GoZoner

12
git fetch -allmengambil semua cabang dari semua remote. git fetch originmengambil semua cabang remote origin. Yang kemudian adalah apa yang diminta OP.
GoZoner

3
--allberarti "semua remote", bukan "semua cabang dari remote yang diberikan". Yang terakhir tersirat oleh pengambilan apa pun dari jarak jauh.
spacediver

2
Ini bukan cara untuk menarik semua cabang ke repo lokal, dari repo jarak jauh.
Vladimir Despotovic

69
$ git remote update
$ git pull --all

Ini mengasumsikan semua cabang dilacak.

Jika tidak, Anda dapat memecat ini di Bash:

for remote in `git branch -r `; do git branch --track $remote; done

Kemudian jalankan perintah.


3
Ketika saya coba itu saya masih mendapatkan hasil yang sama seperti di atas.
David542

4
Sama seperti @JacobLowe, saya mendapatkan kesalahan, tetapi tetap berhasil; 'fatal: Cabang bernama' asal / master 'sudah ada.'
AnneTheAgile

Ini jelek karena akan mencoba membuat cabang ->yang kemungkinan akan ada di output git branch -rsebagai `origin / HEAD -> origin / master`
Tom Hale

Lagipula itu tidak bekerja. Saya mendapatkan output: Output yang Branch 'origin/quote-filenames' set up to track local branch 'master'. diinginkan adalah: Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'. Ini mundur , mengatur asal untuk melacak remote. Lihat jawaban ini untuk perbaikan.
Tom Hale

apa yang saya butuhkan. Karena saya mengganti Mac, bahkan setelah saya mengkloning repo saya tidak dapat checkout cabang jauh lainnya dan git fetchtidak akan berfungsi. Jadi pelajaran di sini adalah bahwa Anda perlu melacak cabang-cabang terpencil. Gracias!
Victor Ramos

58

Bash forloop tidak berfungsi untuk saya, tetapi ini melakukan persis apa yang saya inginkan. Semua cabang dari asal saya dicerminkan sebagai nama yang sama secara lokal.

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

Lihat komentar Mike DuPont di bawah ini. Saya pikir saya sedang mencoba melakukan ini pada Server Jenkins yang membuatnya dalam mode kepala terpisah.


6
Itu menghasilkan fatal: Refusing to fetch into current branch refs/heads/master of non-bare repositorysetelah klon sederhana. Harus melepaskan kepala dulu. Saya melakukan ini dengangit checkout <SHA>
brannerchinese

6
Solusi saya menggunakan ini git checkout --detach # detach the headdan kemudiangit fetch origin \'+refs/heads/*:refs/heads/*
Mike DuPont

1
Yang ini berfungsi untuk saya, kecuali saya juga menggunakan parameter --tags. Saya berharap ada standar, ujung depan sederhana untuk git, jumlah hal-hal sederhana di git yang membutuhkan jawaban stack overflow 10-plus adalah konyol!
kristianp

1
@kristianp Sudahkah Anda mengunjungi Ungit atau GitKraken?
dragon788

@ dragon788 Saya telah menggunakan SourceTree untuk git GUI, tapi saya benar-benar berbicara tentang baris perintah yang lebih sederhana untuk tugas skrip.
kristianp

51

Gunakan git fetch && git checkout RemoteBranchName.

Ini bekerja sangat baik untuk saya ...


6
Ini jawaban terbaik yang baru, kalian semua. Saya tidak tahu apakah mungkin ini tidak mungkin dilakukan sebelumnya, tetapi versi terbaru dari Git setidaknya akan memperhatikan bahwa Anda mencoba untuk checkout cabang jarak jauh dan secara otomatis akan mengatur cabang pelacakan lokal untuk Anda (dan Anda tidak perlu untuk menentukan origin/branch; cukup untuk mengatakan saja branch).
Neil Traft

9
Ini tidak menjawab pertanyaan awal: "Bagaimana saya menarik semua cabang secara lokal?" Ini menarik mereka satu per satu, yang tidak dapat diukur.
ingyhere

Ini adalah satu-satunya jawaban yang memungkinkan saya untuk menarik cabang-cabang terpencil di setiap situasi yang saya temui
Emmanuel Buckshi

38

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, ada cara yang jauh lebih bersih dan lebih cepat, 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.

  2. 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
    
  3. 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 bisa mengetik perintah git branchdan 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.


1
Terpilih untuk menyebutkan cabang tersembunyi. sangat membantu saya memahami pelacakan cabang setempat.
mburke05

Ini jawaban yang bagus, tetapi pertanyaannya menyiratkan sesuatu untuk digunakan setiap hari. Tidak praktis untuk mengkloning repositori setiap saat.
Z. Khullah

Mengapa reset membuat semua cabang secara lokal?
Z. Khullah

@ Z.Khullah bukan reset yang menciptakan semua cabang, tetapi klon --mirror. Sayangnya bagi kami, itu juga membuat repo kosong, yang merupakan langkah 2 dan 3 berubah.
ScottJ

29

Anda dapat mengambil semua cabang dengan:

git fetch --all

atau:

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

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


Untuk menarik semua cabang, gunakan:

git pull --all

Jika di atas tidak berfungsi, maka awali perintah di atas dengan:

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

karena remote.origin.fetchbisa mendukung hanya cabang tertentu saat mengambil, terutama ketika Anda mengkloning repo Anda dengan --single-branch. Memeriksa ini dengan: git config remote.origin.fetch.

Setelah itu Anda harus dapat melakukan checkout cabang apa pun.

Lihat juga:


Untuk mendorong semua cabang ke remote, gunakan:

git push --all

akhirnya --mirroruntuk mencerminkan semua referensi.


Jika tujuan Anda adalah untuk menggandakan repositori, lihat: Menggandakan artikel repositori di GitHub.


1
Luar biasa ... Saya sudah mencoba yang lain sebelum solusi Anda di halaman ini. Terima kasih banyak!
Sujoy

2
Saya menggunakan kloning dangkal ( depth=1) dan konfigurasi juga menentukan satu cabang khusus untuk fetch- depth=1000parameternya adalah perbaikan yang membantu saya untuk checkout cabang jarak jauh tertentu
Sandra

2
pull --alltidak menarik semua cabang, tetapi semua remote
Z. Khullah

Trik yang bagus dengan konfigurasi, meskipun! Akan menjemput mereka semua, sepanjang waktu
Z. Khullah

Saya memeriksa konfigurasi saat Anda menulis, masih hanya berfungsi dengan cabang saat ini. Sepertinya semua jawaban di sini tidak bekerja untuk saya ...
Alexei Martianov

25

Saya biasanya tidak menggunakan yang lain selain perintah seperti ini:

git fetch origin
git checkout --track origin/remote-branch

Versi sedikit lebih pendek:

git fetch origin
git checkout -t origin/remote-branch

17

Saya yakin Anda telah mengkloning repositori dengan:

git clone https://github.com/pathOfrepository

Sekarang buka folder itu menggunakan cd:

cd pathOfrepository

Jika Anda mengetik, git statusAnda dapat melihat semua:

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

Untuk melihat semua jenis cabang tersembunyi:

 git branch -a

Ini akan mendaftar semua cabang jarak jauh.

Sekarang jika Anda ingin checkout pada cabang tertentu cukup ketik:

git checkout -b localBranchName origin/RemteBranchName

16

Jika Anda di sini mencari solusi untuk mendapatkan semua cabang dan kemudian memigrasi semuanya ke server Git lain, saya mengumpulkan proses di bawah ini. Jika Anda hanya ingin mendapatkan semua cabang diperbarui secara lokal, berhenti di baris kosong pertama.

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>

3
Sangat membantu; persis apa yang saya butuhkan. Satu-satunya hal yang harus saya ubah adalah di baris kedua, menambahkan tanda kutip tunggal di sekitar 'HEAD' dan 'master'; mungkin karena saya menggunakan zsh. Terima kasih!
sockmonk

Ini pada dasarnya melakukan hal-hal berikut: (1) Memperoleh nama sebenarnya dari cabang-cabang terpencil [bukan kepala, bukan master]; (2) Sepenuhnya memberitahu Git untuk melacak mereka [tidak semua solusi melakukan ini]; (3) Mengambil dan menarik semuanya dari cabang-cabang ini [termasuk tag]; (4) Menetapkan asal baru dan berjalan terus mendorong semuanya. Sekali lagi, sebagian besar solusi lain gagal untuk memindahkan semua bagian. Ini semua.
ingyhere

1
Saya menghapus antipattern dari menjalankan grep kemudian awk dan memadatkan perintah grep ke perintah awk. Tripleee terima kasih !
ingyhere

Baca ini dan jangan pernah menulis git fetch git pull stackoverflow.com/a/292359/1114926
Hijau

Git pullmemang melakukan yang fetchpertama tetapi lebih mudah untuk mengetahui apakah masalahnya berasal dari fetchbagian pullatau bagian selanjutnya mergedari pullkapan fetchdieksekusi secara independen.
ingyhere

12

Setelah Anda mengkloning repositori master, Anda bisa menjalankannya

git fetch && git checkout <branchname>

1
sederhana. dan bekerja untuk mendapatkan cabang dari asal yang jauh
sirvon

3
Ini tidak menjawab pertanyaan awal: "Bagaimana saya menarik semua cabang secara lokal?" Ini menarik mereka satu per satu, yang tidak dapat diukur. Pertimbangkan kasus 100 cabang.
sana

10

Pastikan semua cabang jarak jauh dapat diambil dalam .git/configfile.

Dalam contoh ini, hanya origin/productioncabang yang dapat diambil, bahkan jika Anda mencoba untuk melakukan git fetch --allapa pun tidak akan terjadi selain mengambil productioncabang:

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

Baris ini harus diganti oleh:

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

Kemudian jalankan git fetchdll ...


3
Untuk memeriksa: git config --get remote.origin.fetchdan kemudian (secara destruktif) atur:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
qneill

atau memodifikasi file teks config di direktori .git, berfungsi untuk saya
FDIM

9

Looping sepertinya tidak bekerja untuk saya dan saya ingin mengabaikan asal / master. Inilah yang bekerja untuk saya.

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

Setelah itu:

git fetch --all
git pull --all

1
Variasi dari ini adalah jawaban yang benar, tetapi yang ini tidak bekerja di semua kasus tepi. Juga, nama-nama cabang bisa funky. Jadi saya melakukan yang berikut ini: git branch -r | grep -v KEPALA | grep –v master | awk -F'origin / '' {print $ 2 "" $ 1 "origin /" $ 2} '| xargs -L 1 cabang git -f --track; git fetch --all; git pull --semua; DAN YANG MELAKUKAN TRIK!
ingyhere

3
Peningkatan gaya untuk menghindari grep | awk antipattern : git branch -r | awk -F 'origin/' '!/HEAD|master/{...
tripleee

7

Hanya tiga perintah ini yang akan mendapatkan semua cabang:

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard

Ini sebenarnya adalah akar dari masalah OP. Jika dikloning dengan benar, dia tidak perlu melakukan pull --all. Tetapi jika masih diperlukan, maka jawaban lainnya di bawah, oleh @Johnno Nola, dengan asumsi semua cabang dilacak, dicampur dengan jawaban ini, adalah jalan yang harus ditempuh.
Dr Beco

7

Mengapa tidak ada yang menjawab pertanyaan mereka dan menjelaskan apa yang terjadi?

  1. Pastikan Anda melacak semua cabang jarak jauh (atau cabang mana yang ingin Anda lacak) .
  2. Perbarui cabang lokal Anda untuk mencerminkan cabang jarak jauh.

Lacak semua cabang jarak jauh:

Lacak semua cabang yang ada di repo jarak jauh.

Lakukan secara manual:

Anda akan mengganti <branch>dengan cabang yang ditampilkan dari output git branch -r.

git branch -r
git branch --track <branch>

Lakukan dengan skrip bash

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

Perbarui informasi tentang cabang jarak jauh di komputer lokal Anda:

Ini mengambil pembaruan pada cabang dari repo jarak jauh yang Anda lacak dalam repo lokal Anda. Ini tidak mengubah cabang lokal Anda. Repo git lokal Anda sekarang mengetahui hal-hal yang terjadi pada cabang repo jarak jauh. Contohnya adalah bahwa komit baru telah didorong ke master jarak jauh, melakukan pengambilan sekarang akan mengingatkan Anda bahwa master lokal Anda di belakang oleh 1 komit.

git fetch --all

Perbarui informasi tentang cabang jarak jauh di komputer lokal Anda dan perbarui cabang lokal:

Apakah pengambilan diikuti oleh gabungan untuk semua cabang dari jarak jauh ke cabang lokal. Contohnya adalah bahwa komit baru telah didorong ke master jarak jauh, melakukan tarik akan memperbarui repo lokal Anda tentang perubahan di cabang jarak jauh dan kemudian akan menggabungkan perubahan itu ke cabang lokal Anda. Ini dapat membuat kekacauan karena menggabungkan konflik.

git pull --all

4

Saya menulis naskah kecil untuk mengelola kloning repo baru dan membuat cabang lokal untuk semua cabang terpencil.

Anda dapat menemukan versi terbaru di sini :

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

Untuk menggunakannya, cukup salin ke direktori git bin Anda (bagi saya, itu C:\Program Files (x86)\Git\bin\git-cloneall), lalu, pada baris perintah:

git cloneall [standard-clone-options] <url>

Ini klon seperti biasa, tetapi membuat cabang pelacakan lokal untuk semua cabang jarak jauh.


4

Cara Mengambil Semua Pelacakan Cabang Git Remote Tunggal.

Ini telah diuji dan berfungsi pada Red Hat dan Git Bash pada Windows 10.


TLDR:

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

Penjelasan:

Liner satu memeriksa dan kemudian mengambil semua cabang kecuali KEPALA.

Daftar cabang-cabang pelacakan jarak jauh.

git branch -r

Abaikan KEPALA.

grep -v ' -> '

Hapus nama cabang dari remote.

cut -d"/" -f2

Periksa semua cabang yang melacak satu remote.

git checkout $branch

Ambil untuk cabang keluar.

git fetch

Secara teknis pengambilan tidak diperlukan untuk cabang lokal baru.

Ini dapat digunakan untuk fetchataupull cabang yang sama-sama baru dan memiliki perubahan dalam jarak jauh.

Pastikan Anda hanya menarik jika Anda siap untuk bergabung.


Pengaturan Tes

Lihat repositori dengan URL SSH.

git clone git@repository.git

Sebelum

Periksa cabang di lokal.

$ git branch
* master

Jalankan Perintah

Jalankan one liner.

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

Setelah

Periksa cabang lokal termasuk cabang jarak jauh.

$ git branch
  cicd
  master
* preprod

4

Untuk pengguna Windows yang menggunakan PowerShell:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*?/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all

Ini bekerja dengan cabang dengan / dalam nama: git branch -r | ForEach-Object { # Skip default branch, this script assumes # you already checked-out that branch when cloned the repo if (-not ($_ -match " -> ")) { $localBranch = ($_ -replace "^.*?/", "") $remoteBranch = $_.Trim() git branch --track "$localBranch" "$remoteBranch" } }
Markus

3

Inilah sesuatu yang saya anggap kuat:

  • Tidak memperbarui pelacakan jarak jauh untuk cabang yang ada
  • Tidak mencoba memperbarui HEADuntuk melacakorigin/HEAD
  • Mengizinkan remote dinamai selain origin
  • Shell dikutip dengan benar
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

Ini tidak perlu git fetch --allsebagai passing -alluntuk git pullmeneruskan opsi ini ke internal fetch.

Terima kasih atas jawaban ini .


2

Berikut adalah versi Perl dari satu-liner yang disediakan dalam jawaban yang diterima:

git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

Anda dapat menjalankan file output sebagai skrip Shell jika Anda mau.

Kami menghapus repositori proyek Stash kami secara tidak sengaja. Untungnya seseorang telah membuat garpu tepat sebelum kehilangan yang tidak disengaja. Saya mengkloning garpu ke lokal saya (akan menghilangkan detail bagaimana saya melakukan itu). Begitu saya memiliki garpu sepenuhnya di lokal saya, saya berlari satu baris. Saya memodifikasi URL remote (asal dalam kasus saya) untuk menunjuk ke repositori target yang sedang kami pulihkan ke:

git remote set-url origin <remote-url>

Dan akhirnya mendorong semua cabang ke asal seperti:

git push --all origin

dan kami kembali berbisnis.


1

Kita bisa meletakkan semua nama cabang atau tag dalam file sementara, lalu lakukan git pull untuk setiap nama / tag:

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done

1

Jika Anda memiliki masalah dengan fetch --allmaka lacak cabang jarak jauh Anda:

git checkout --track origin/%branchname%

1

Untuk menghindari pesan kesalahan 'fatal: Cabang bernama' asal / master 'sudah ada.', Anda memerlukan ini:

git branch -r | grep -v '\->'  | grep -v `git branch | awk '/\*/ { print $2; }'`| while read remote; do git branch --track "${remote#origin/}" "$remote"; done

0

Berdasarkan jawaban oleh Learath2, inilah yang saya lakukan setelah melakukan git clone [...]dan- cdmasuk ke direktori yang dibuat:

git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

Bekerja untuk saya tetapi saya tidak tahu itu akan berhasil untuk Anda. Hati-hati.


0
git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

Sekarang secara lokal milik yourNewLocalBranchNameAnda requiredRemoteBranch.


0

Untuk Pengguna Visual Studio, konsol On Package Manager:

cabang git | % {git mengambil hulu; git menggabungkan upstream / master}


0

Telah mencoba banyak cara, hanya yang ini sederhana dan bekerja untuk saya.

for branch in $(git ls-remote -h git@<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done

0

Tetapkan alias: (berdasarkan jawaban atas)

git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'

Sekarang untuk melacak semua cabang:

git track-all-branches

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.