Inilah hook saya saat ini dalam repo kosong yang tinggal di server perusahaan:
git push origin master
Hook ini mendorong ke Assembla. Yang saya perlukan adalah mendorong hanya satu cabang (master, idealnya) ketika seseorang mendorong perubahan ke cabang itu di server kami, dan mengabaikan dorongan ke cabang lain. Apakah mungkin untuk memilih cabang dari repo telanjang dan hanya mendorong cabang itu ke Assembla?
git
repository
hook
git-bare
Jorge Guberte
sumber
sumber
git push origin master
hanya akan mendorongmaster
cabang keorigin
remote, yang saya asumsikan didefinisikan sebagai Assembla. Apakah Anda mengatakan bahwa Anda perlu memicu kail hanya ketika seseorang mendorongmaster
, sebagai lawanfeature1
, atau sesuatu seperti itu?Jawaban:
Hook pasca-terima mendapatkan argumennya dari stdin, dalam bentuk
<oldrev> <newrev> <refname>
. Karena argumen ini berasal dari stdin, bukan dari argumen baris perintah, Anda perlu menggunakanread
bukan$1 $2 $3
.Hook pasca-terima dapat menerima banyak cabang sekaligus (misalnya jika seseorang melakukan a
git push --all
), jadi kita juga perlu membungkusnyaread
dalam satuwhile
lingkaran.Cuplikan yang berfungsi terlihat seperti ini:
sumber
#!/bin/sh
bukan#!/bin/bash
?refs/heads/master
bukannyarefs/tags/master
Anda harus baik-baik saja. Mungkin ada kasus tepi lain seperti ini yang tidak bisa saya pikirkan. Ini bisa menjadi pertanyaan StackOverflow yang bagus dengan sendirinya.if branch=$(git rev-parse --symbolic --abbrev-ref $refname 2>/dev/null); then
agar git tidak mengeluh ketika saya menghapus cabang.Parameter terakhir yang didapat hook pasca-terima pada stdin adalah ref yang diubah, jadi kita bisa menggunakannya untuk memeriksa apakah nilai itu adalah "refs / heads / master". Sedikit ruby yang mirip dengan yang saya gunakan di hook pasca-terima:
Perhatikan bahwa itu mendapat garis untuk setiap ref yang didorong, jadi jika Anda mendorong lebih dari sekadar master, itu akan tetap berfungsi.
sumber
Jawaban Stefan tidak berhasil untuk saya, tetapi ini berhasil:
sumber
Tidak satu pun dari solusi di atas yang berhasil untuk saya. Setelah banyak, banyak debugging, ternyata menggunakan perintah 'read' tidak berfungsi - sebagai gantinya, mengurai argumen baris perintah dengan cara biasa berfungsi dengan baik.
Berikut adalah pengait pasca-pembaruan yang baru saja berhasil saya uji sekarang di CentOS 6.3.
UPDATE: pada catatan yang lebih aneh, hook pra-terima mengambil inputnya melalui stdin, oleh karena itu baca dengan 'read' (wow, tidak pernah terpikir saya akan mengatakan itu). Pengait pasca-pembaruan masih berfungsi dengan $ 1 untuk saya.
sumber
post-receive
pengait, bukanpost-update
pengait. Mereka menerima masukan mereka dengan cara yang berbeda.post-receive
mengambil stdin seperti yang disebutkan di sini: git-scm.com/book/en/v2/Customizing-Git-Git-HooksJawaban dari @pauljz berfungsi dengan baik untuk kait git tertentu seperti
pre-push
, tetapipre-commit
tidak memiliki akses ke variabel tersebutoldrev newrev refname
Jadi saya membuat versi alternatif ini yang berfungsi untuk pre-commit, atau really and hook. Ini adalah
pre-commit
hook yang akan menjalankanhusky
skrip jika kita TIDAK berada dimaster
cabang.Saya harap itu membantu seseorang. Anda dapat dengan mudah memodifikasi untuk kebutuhan Anda, apa pun di antara pernyataan
if
danfi
.sumber
Saya telah menulis skrip PHP untuk diri saya sendiri untuk melakukan fungsi ini.
https://github.com/fotuzlab/githubdump-php
Host file ini di server Anda, sebaiknya repo root dan tentukan url di webhook github. Ubah 'allcommits' di baris 8 dengan nama cabang Anda dan tambahkan kode / fungsi Anda di baris 18.
misalnya
sumber
Pendekatan sederhana, dalam
git hook
menulisSederhana - info lebih lanjut tentang sistem pengait tautan yang hebat ini
sumber