Saya kloning Git repositori, yang berisi sekitar lima cabang. Namun, ketika saya melakukan git branch
saya hanya melihat salah satu dari mereka:
$ git branch
* master
Saya tahu bahwa saya bisa melakukan git branch -a
untuk melihat semua **** cabang-cabang, tapi bagaimana saya akan tarik semua cabang-cabang lokal jadi ketika saya melakukan git branch
, itu menunjukkan berikut?
$ git branch
* master
* staging
* etc...
Anda dapat mengambil semua cabang dari semua remote seperti ini:
git fetch --all
It's pada dasarnya adalah power move.
ambil
update salinan lokal dari remote cabang jadi, ini adalah selalu aman untuk anda cabang-cabang lokal TAPI:
ambil
tidak akan perbarui ** cabang-cabang lokal (yang trek** remote cabang); jika anda ingin memperbarui cabang-cabang lokal anda masih perlu untuk menarik setiap cabang.
ambil
tidak akan buat cabang-cabang lokal (yang trek remote cabang), anda harus melakukan hal ini secara manual. Jika anda ingin daftar semua remote cabang:
git branch -a
Untuk update cabang-cabang lokal yang melacak jarak jauh cabang:
git pull --all
Namun, hal ini dapat masih kurang. Ini akan bekerja hanya untuk cabang-cabang lokal yang melacak jarak jauh cabang. Untuk melacak semua remote cabang mengeksekusi ini oneliner SEBELUM git pull-semua
:
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all
(Sepertinya menarik menjemput semua cabang dari semua remote, tapi aku selalu mengambil yang pertama hanya untuk memastikan.)
Jalankan perintah pertama hanya jika ada remote cabang di server yang tidak't dilacak oleh cabang-cabang lokal.
P. S. AFAIK git fetch-semua
dan git remote update
yang setara.
Kamil Szot's komentar, orang-orang yang telah menemukan berguna.
saya harus menggunakan:
untuk remote di
git branch -r
; lakukan git branch --track ${remote#asal/} $terpencil; dilakukankarena kode yang dibuat cabang-cabang lokal bernama
asal/branchname
dan saya mendapatkan "refname 'asal/branchname' adalah ambigu setiap kali saya disebut itu.
Anda akan perlu untuk membuat cabang-cabang lokal pelacakan jarak jauh cabang.
Dengan asumsi bahwa anda've punya hanya satu remote yang disebut asal
, potongan ini akan membuat cabang-cabang lokal untuk semua remote tracking orang-orang:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done
Setelah itu, git fetch-semua
akan memperbarui semua salinan lokal dari remote cabang.
Juga, git pull-semua
akan memperbarui lokal pelacakan cabang, tetapi tergantung pada lokal anda melakukan dan bagaimana 'gabung' mengkonfigurasi opsi disetel mungkin membuat gabungan melakukan, fast-forward atau gagal.
Jika anda lakukan:
git fetch origin
kemudian mereka akan semua yang ada secara lokal. Jika anda kemudian melakukan:
git branch -a
anda'll melihat mereka terdaftar sebagai remote/asal/branch-name. Sejak mereka ada secara lokal anda dapat melakukan apapun yang anda silahkan dengan mereka. Misalnya:
git diff origin/branch-name
atau
git merge origin/branch-name
atau
git checkout -b some-branch origin/branch-name
Bash untuk
loop tidak't bekerja untuk saya, tapi 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 Mike DuPont's komentar di bawah ini. Saya pikir saya mencoba untuk melakukan hal ini pada Jenkins Server yang daun itu di kepala terpisah mode.
Ketika anda menduplikasi sebuah repositori semua informasi dari cabang-cabang adalah benar-benar download tapi cabang-cabang yang tersembunyi. Dengan perintah
$ git branch -a
anda dapat menampilkan semua cabang-cabang dari repositori, dan dengan perintah
$ git checkout -b branchname origin/branchname
anda kemudian dapat "download" mereka secara manual satu per satu.
Namun, ada yang jauh lebih bersih dan cara yang lebih cepat, meskipun itu's sedikit rumit. Anda perlu tiga langkah untuk mencapai hal ini:
membuat folder baru pada mesin anda dan clone cermin salinan .git folder dari repositori:
$ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder $ git clone --cermin https://github.com/planetoftheweb/responsivebootstrap.git .git
repositori lokal di dalam folder my_repo_folder masih kosong, hanya ada yang tersembunyi .git folder sekarang anda bisa melihat dengan "ls -alt" perintah dari terminal.
beralih repositori ini dari kosong (bare) repositori untuk reguler repositori dengan mengganti nilai boolean "telanjang" dari git konfigurasi palsu:
$ git config --bool core.telanjang palsu
Ambil segala sesuatu yang di dalam folder saat ini dan membuat semua cabang pada mesin lokal, sehingga membuat hal ini normal repo.
$ git reset --hard
Jadi sekarang anda bisa ketik perintah git cabang
dan anda dapat melihat bahwa semua cabang di-download.
Ini adalah cara cepat di mana anda dapat menduplikasi sebuah repositori git dengan semua cabang-cabang sekaligus, tapi itu's tidak sesuatu yang anda ingin lakukan untuk setiap proyek dengan cara ini.
Anda dapat mengambil semua cabang oleh:
git fetch --all
atau:
git fetch origin --depth=10000 $(git ls-remote -h -t origin)
--kedalaman=10000
parameter dapat membantu jika anda've shallowed repository.
Untuk menarik semua cabang, gunakan:
git pull --all
Jika di atas tidak't bekerja, kemudian mendahului perintah di atas dengan:
git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
sebagai remote.asal.fetch
bisa mendukung hanya cabang tertentu saat mengambil, terutama ketika anda kloning anda repo dengan --single-cabang
. Memeriksa ini dengan: git config remote.asal.fetch
.
Setelah itu anda harus dapat checkout setiap cabang.
Lihat juga:
Untuk mendorong semua cabang untuk remote, menggunakan:
git push --all
akhirnya --cermin
ke cermin semua ref.
Jika tujuan anda adalah untuk menduplikasi sebuah repositori, lihat: Menduplikasi sebuah repositori artikel di GitHub.
Saya percaya anda memiliki kloning repositori oleh:
git clone https://github.com/pathOfrepository
Sekarang pergi ke folder tersebut menggunakan cd:
cd pathOfrepository
Jika anda ketik git status
anda dapat melihat semua:
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Untuk melihat semua cabang tersembunyi jenis:
git branch -a
Ini akan menampilkan semua remote branchs.
Sekarang jika anda ingin checkout pada setiap cabang tertentu cukup ketik:
git checkout -b localBranchName origin/RemteBranchName
Jika anda berada di sini mencari solusi untuk mendapatkan semua cabang dan kemudian bermigrasi segala sesuatu yang lain Git server, saya menempatkan bersama-sama di bawah ini proses. 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>
Pastikan semua remote cabang fetchable dalam .git/config
file.
Dalam contoh ini, hanya asal/produksi
branch fetchable, bahkan jika anda mencoba untuk melakukan git fetch-semua
tidak akan terjadi tetapi mengambil produksi
cabang:
[origin]
fetch = +refs/heads/production:refs/remotes/origin/production
Baris ini harus diganti dengan:
[origin]
fetch = +refs/heads/*:refs/remotes/origin/*
Kemudian jalankan git fetch` dll...
Perulangan didn't tampaknya bekerja untuk saya dan saya ingin mengabaikan asal/induk. Berikut ini's apa 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
Hanya tiga perintah akan mendapatkan semua cabang:
git clone --mirror repo.git .git (gets just .git - bare repository)
git config --bool core.bare false
git reset --hard
Saya menulis sedikit script untuk mengelola kloning baru repo dan membuat cabang-cabang lokal untuk semua cabang.
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 copy ke git direktori bin (bagi saya, itu C:\Program Files (x86)\Git\bin\git-cloneall
), maka, pada baris perintah:
git cloneall [standard-clone-options] <url>
Ini klon seperti biasa, tapi menciptakan setempat cabang pelacakan untuk semua cabang.
Berikut ini's sesuatu yang saya'd pertimbangkan kuat:
KEPALA
untuk lagu asal/KEPALA
asal
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
It's tidak diperlukan untuk git fetch-semua lewat
semuauntuk
git pullmelewati opsi ini untuk internal
ambil`.
Kredit untuk jawaban.
Ini telah diuji dan fungsi 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:
Salah satu kapal yang memeriksa dan kemudian mengambil semua cabang kecuali KEPALA.
Daftar jarak jauh-melacak cabang.
git branch -r
Mengabaikan KEPALA.
grep -v ' -> '
Mengambil nama cabang off dari remote(s).
cut -d"/" -f2
Checkout semua cabang pelacakan remote tunggal.
git checkout $branch
Fetch untuk memeriksa cabang.
git fetch
Secara teknis pengembaliannya tidak diperlukan untuk cabang lokal baru.
Ini dapat digunakan untuk ambil
atau menarik
cabang-cabang yang baru dan perubahan di remote(s).
Hanya pastikan bahwa anda hanya menarik jika anda siap untuk bergabung.
Memeriksa repositori dengan SSH URL.
git clone [email protected]
Sebelum
Cek cabang-cabang di daerah.
$ git branch
* master
Menjalankan Perintah
Melaksanakan salah satu kapal.
for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;
Setelah
Cek cabang-cabang lokal termasuk remote(s) cabang-cabang.
$ git branch
cicd
master
* preprod
Berikut ini's Perl versi one-liner yang diberikan dalam jawaban yang diterima:
git branch -r | perl -e 'sedangkan(<>) {memotong; my $remote = $_; my ($lokal) = ($remote =~ /asal\/(.*)/); cetak "git branch --track $lokal $remote\n";}' > beberapa-output-file
Anda dapat menjalankan file output seperti Shell script jika anda'd suka.
Kami dihapus Simpanan kami proyek repositori oleh kecelakaan. Untungnya seseorang telah menciptakan garpu tepat sebelum kehilangan yang tidak disengaja. Saya kloning garpu untuk lokal saya (akan menghilangkan rincian tentang bagaimana saya melakukan itu). Setelah saya garpu sepenuhnya di lokal saya, saya berlari one-liner. Aku dimodifikasi remote's URL (asal dalam kasus saya) untuk menunjuk ke target repositori kami pulih untuk:
git remote set-url asal <remote url>
Dan akhirnya mendorong semua cabang ke asal seperti:
git push-semua asal
dan kami telah kembali dalam bisnis.