Saya perlu melakukan penggabungan subtree untuk cabang tertentu, jika itu ada di repositori jarak jauh tertentu. Masalahnya adalah repositori jarak jauh tidak diperiksa secara lokal, jadi saya tidak dapat menggunakan git branch -r
. Yang saya miliki hanyalah alamat remote, seperti ini https://github.com/project-name/project-name.git
. Apakah ada cara untuk membuat daftar cabang jarak jauh hanya dengan alamat jarak jauh? Saya tidak dapat menemukan apa pun yang bergunal :(
106
git ls-remote --heads ${REPO} ${BRANCH} | grep ${BRANCH} >/dev/null
diikuti olehif [ "$?" == "1" ] ; then echo "Branch doesn't exist"; exit; fi
/refs/heads/branch-name
. Jika tidak, cabangfoo/branch-name
akan dikembalikan meskipun tidak adabranch-name
.git ls-remote --heads origin branch-name
sumber
git ls-remote --exit-code . origin/branch-name &> /dev/null
kemudian digunakan$?
sebagai operan tesif git ls-remote ...; then ...; fi
, kurang rentan terhadap kesalahan daripada memeriksa$?
(yang dapat diubah dengan membuat log pernyataan, perangkap, dll).--heads
?--heads
hanya mencantumkan cabang. menggunakan--tags
untuk mendaftar tag saja.Cara lain yang dapat Anda gunakan di folder saat ini jika itu adalah git repo untuk dijalankan
sumber
git branch -a | egrep "remotes/origin/${YOUR_BRANCH_NAME}$"
git branch -a | grep "\b${BRANCH}$"
git fetch
diperlukan jika menggunakangit branch -a
jadi semua referensi jarak jauh diambil terlebih dahulu. Lain digunakangit ls-remote
seperti yang ditunjukkan oleh orang lain.git branch -a --list '<pattern>'
juga merupakan pilihan. Gunakan pipa ke grep jika Anda membutuhkan kode pengembalian untuk skrip Anda.Anda juga dapat menggunakan ini:
mengembalikan komit terbaru dan nilai $? is 0 sebaliknya mengembalikan "fatal: bad sha1 reference remotes / origin / <>" dan nilai $? adalah 128
sumber
Anda dapat melakukan sesuatu seperti ini di terminal Bash. Cukup ganti echos dengan perintah yang ingin Anda jalankan.
Semoga membantu.
sumber
Maka tidak perlu setiap kali meneruskan nama repositori secara manual.
Dari pada
Contoh:
ATAU
Keduanya akan memberikan hasil yang sama:
Lebih lanjut tentang Origin : Git memiliki konsep "remote", yang merupakan URL sederhana ke salinan lain dari repositori Anda. Saat Anda mengkloning repositori lain, Git secara otomatis membuat remote bernama "origin" dan menunjuk ke sana. Anda dapat melihat informasi lebih lanjut tentang remote dengan mengetik git remote show origin.
sumber
Semua jawaban di sini adalah khusus untuk shell Linux, yang tidak banyak membantu jika Anda berada di lingkungan yang tidak mendukung operasi semacam itu - misalnya, command prompt Windows.
Untungnya
git ls-remote
menerima--exit-code
argumen yang mengembalikan 0 atau 2 bergantung pada apakah cabang itu ada atau tidak. Begitu:git ls-remote --exit-code --heads origin <branch-that-exists-in-origin>
akan mengembalikan 0, dan
git ls-remote --exit-code --heads origin <branch-that-only-exists-locally>
akan mengembalikan 2.
Untuk PowerShell, Anda cukup menggunakan semantik penanganan kebenaran bawaan:
if (git ls-remote --heads origin <branch-that-exists-in-origin>) { $true } else { $false }
hasil
$true
, sementara:if (git ls-remote --heads origin <branch-that-only-exists-locally>) { $true } else { $false }
hasil
$false
.sumber
bekerja hampir sepanjang waktu.
Tetapi tidak akan berfungsi jika cabang cocok sebagian seperti di bawah ini,
Menggunakan
jika Anda menginginkan cara yang dapat diandalkan.
Jika Anda ingin menggunakan script dan tidak ingin menganggap
origin
remote default makaharus bekerja.
Perhatikan bahwa
git branch -a | grep ...
tidak dapat diandalkan karena mungkin beberapa saat sejak terakhirfetch
dijalankan.sumber
grep -x "$branch"
identik dengangrep ^"$branch"$
). Meskipun dalam skrip Saya lebih suka bentuk panjang switch:--line-regexp
. Juga, tidak perlu dilakukanwc -l
. Menempatkan keluaran kosong di Bashif [ -z ]
secara efektif mengevaluasi sebagai benar sehingga itu berarti bahwa cabang tidak ada. Itu menghemat beberapa milidetik.Anda dapat menambahkan repositori yang Anda miliki sebagai remote menggunakan
git remote add something https://github.com/project-name/project-name.git
dan kemudian melakukan agit remote show something
untuk mendapatkan semua informasi tentang remote tersebut. Ini membutuhkan koneksi jaringan dan berguna untuk digunakan manusia.Sebagai alternatif, lakukan a
git fetch something
. Ini akan mengambil semua cabang pada remote yang dipanggilsomething
dan menyimpannya di repositori lokal Anda. Anda kemudian dapat menggabungkannya ke cabang lokal Anda sesuka Anda. Saya merekomendasikan jalur ini karena jika Anda akhirnya memutuskan bahwa Anda harus menggabungkan, inilah yang perlu Anda lakukan.OT: Penggunaan "check out secara lokal" menunjukkan bahwa Anda mendekati ini dari sudut pandang sistem kontrol versi terpusat. Itu biasanya jalan buntu ketika Anda berurusan dengan git. Ia menggunakan kata-kata seperti "checkout" dll. Secara berbeda dari bagaimana sistem yang lebih lama melakukannya.
sumber
Anda dapat mencoba
Di sini
@{u}
mengacu pada remote / upstream, dan@{0}
mengacu pada HEAD lokal saat ini (dengan versi git yang lebih baru,@{0}
dapat disingkat sebagai@
). Jika jarak jauh tidak ada, kesalahan keluar.Dengan git 2.16.2 (Saya tidak yakin versi mana yang pertama memiliki fungsi ini, misalnya, git 1.7.1 tidak memilikinya), Anda dapat melakukannya
Jika ada cabang jarak jauh, akan ada beberapa keluaran, seperti
Jika tidak, tidak ada keluaran.
sumber
Akan mengembalikan semua cabang (jarak jauh atau lokal) yang berisi kueri dalam nama.
git branch --all | grep <query>
sumber
Jika nama cabang Anda sangat spesifik, Anda mungkin tidak perlu menggunakan grep untuk pencocokan nama cabang yang sederhana:
yang berhasil
Kami menggunakan id masalah unik sebagai nama cabang dan berfungsi dengan baik.
sumber
Saya baru saja mencoba ini:
Ini akan mengembalikan 1 jika cabang "cabang-Anda" ditemukan dan 0 jika tidak.
sumber
Saya menggabungkan beberapa jawaban di atas dalam sebuah skrip:
Skrip ini akan mendapatkan 4 cabang dari bitbucket jarak jauh, dan mendorongnya ke github jarak jauh, dan kemudian akan mendorong semua tag ke github. Saya menggunakan ini dalam pekerjaan Jenkins, itulah mengapa Anda tidak melihat satu pun
git fetch
ataugit pull
, itu sudah dilakukan di konfigurasi repositori pekerjaan Jenkins.Saya biasanya lebih suka opsi bentuk panjang dalam skrip. Saya bisa menggabungkan
git branch
dangit checkout
menggunakangit checkout -B
.sumber