Rumah >Peranti teknologi >industri IT >Pengenalan cangkuk git
3
Takeaways Key
cangkuk git adalah skrip mudah yang dijalankan sebelum atau selepas tindakan tertentu, seperti ujian sintaks pada fail yang dilakukan, dan boleh ditulis dalam mana -mana bahasa persekitaran boleh berfungsi.
Server-side-Ini dijalankan pada pelayan yang menganjurkan repositori git
cangkuk sisi pelayan tidak akan diliputi dalam artikel ini. Walau bagaimanapun, ambil perhatian bahawa jika projek anda berada pada perkhidmatan seperti GitHub, cangkuk sisi pelayan biasanya tidak berkenaan. Di GitHub, bersamaan dengan cangkuk sisi pelayan adalah menggunakan perkhidmatan dan webhooks yang boleh didapati dalam tetapan projek anda.
Contoh cangkuk: Mengesahkan sintaks php
<span>git clone git@github.com:symfony/symfony.git </span><span>cd symfony </span><span>ls .git/hooks</span>Kami akan bermula dengan cangkuk yang sangat mudah, yang ditulis dalam bash, yang mengesahkan kod PHP yang dilakukan mempunyai sintaks yang sah. Ini adalah untuk menghalang komitmen "cepat" tetapi patah daripada berlaku. Sudah tentu saya tidak menggalakkan "komitmen sederhana" yang tidak mempunyai ujian, tetapi itu tidak bermakna mereka tidak akan berlaku.
dalam .git/cangkuk kita boleh memulakan fail baru yang dipanggil pra-komite. Ia mesti mempunyai keizinan untuk melaksanakan:
applypatch-msg.sample commit-msg.sample post-update.sample pre-applypatch.sample pre-commit pre-commit.sample prepare-commit-msg.sample pre-push.sample pre-rebase.sample update.sample
<span>git clone git@github.com:symfony/symfony.git </span><span>cd symfony </span><span>ls .git/hooks</span>
Anda boleh menggunakan editor kegemaran anda untuk mula menulis. Pertama kita memerlukan shebang. Cara saya yang disukai adalah menggunakan/usr/bin/env kerana ini menggunakan jalan yang betul untuk aplikasi yang kita inginkan dan bukannya jalan yang keras dan mungkin tidak sah. Buat masa ini kita akan terus gagal supaya kita dapat menguji dengan mudah.
applypatch-msg.sample commit-msg.sample post-update.sample pre-applypatch.sample pre-commit pre-commit.sample prepare-commit-msg.sample pre-push.sample pre-rebase.sample update.sample
PHP mempunyai pilihan yang berguna untuk pengesahan sintaks: -L. Ia memerlukan hujah fail tunggal, jadi kita perlu melengkapkan melalui apa sahaja fail PHP yang sedang diubah. Untuk kesederhanaan kami akan menganggap mana -mana fail PHP yang dilakukan sentiasa berakhir di .php. Oleh kerana cangkuk dijalankan dari akar repositori, kita boleh menggunakan arahan git standard untuk mendapatkan maklumat mengenai perubahan, seperti status git.
di atas garis #always gagal kita boleh menggunakan perkara berikut untuk mendapatkan semua fail php yang diubah suai:
<span>cd .git/hooks </span><span>touch pre-commit </span><span>chmod +x pre-commit</span>
Penjelasan:
Ini mungkin kelihatan agak pelik tetapi! PHP -L "$ I" (perhatikan petikan untuk mengelakkan isu dengan ruang) sebenarnya memeriksa nilai pulangan 0, tidak benar atau mana -mana jenis nilai yang biasanya kita harapkan dalam bahasa lain. Hanya untuk rujukan, kod PHP yang setara adalah:
<span>#!/usr/bin/env bash </span><span># Hook that checks PHP syntax </span> <span># Override IFS so that spaces do not count as delimiters </span><span>old_ifs=$IFS </span><span><span>IFS</span>=$'<span title="\n">\n'</span> </span> <span># Always fail </span><span>exit 1</span>
Saya membuat perubahan buruk kepada src/symfony/component/finder/glob.php dengan tujuan untuk menguji ini dan output dari git komit -m 'test' adalah seperti:
<span>php_files=<span>$(git status --short | grep -E '^(A|M)' | awk '{ print }' | grep -E '\.php$')</span></span>
Saya membuat gelung keluar dari keseluruhan skrip seawal mungkin dan ini akhirnya mungkin bukan apa yang kita mahu. Kami mungkin sebenarnya mahu ringkasan perkara untuk diperbaiki berbanding dengan harus terus berusaha. Sesiapa sahaja akan mudah kecewa dan mungkin belajar menggunakan komitmen git-tidak boleh dilakukan untuk memintas cangkuk sama sekali.
<span>for file in $php_files; do </span> <span>if ! php -l "<span>$i"</span>; then </span> <span>exit 1 </span> <span>fi </span><span>done</span>
Jadi, janganlah keluar dari kesilapan dengan php -l tetapi saya masih ingin menyimpan perkara yang mudah dibaca:
di sini kita menangkap output untuk php -l (dan memaksa output ralat standard ke output standard). Kami menyemak status keluar php -l menggunakan pembolehubah khas $? (yang merupakan kod status keluar) dan operator -EQ. Kami menyatakan bahawa ralat sintaks berlaku (perhatikan penggunaan $ {} untuk pembolehubah dalam rentetan). Akhirnya, kami memberikan garis yang relevan untuk kesilapan untuk memastikan output sedikit lebih ringkas (Grepping untuk '^parse ralat'), dan kami memberikan satu garis kosong untuk memastikan ini sedikit lebih mudah dibaca.
<span>foreach ($php_files as $file) { </span> <span>$retval = 0; </span> <span>$escapedFile = escapeshellarg($file); </span> <span>exec('php -l ' . $escapedFile, $retval); // $retval passed in as out parameter reference </span> <span>if ($retval !== 0) { </span> <span>exit(1); </span> <span>} </span><span>}</span>
Saya membuat dua pengubahsuaian yang buruk dan output untuk percubaan pada komit seperti ini:
<span>git clone git@github.com:symfony/symfony.git </span><span>cd symfony </span><span>ls .git/hooks</span>
Sekarang tindakan adalah untuk menyelesaikan masalah ini, menguji, dan cuba melakukan lagi.
Untuk melengkapkan skrip cangkuk, keluarkan keluar 1 di bahagian bawah skrip. Cuba lakukan fail PHP yang sah dan ia harus berfungsi seperti biasa.
cangkuk tidak diedarkan dengan projek anda dan tidak boleh dipasang secara automatik. Oleh itu, tindakan terbaik anda adalah untuk mewujudkan tempat untuk anda cangkuk untuk hidup (boleh berada di repositori yang sama) dan memberitahu kolaborator anda untuk menggunakannya. Jika anda membuat ini mudah untuk mereka, mereka lebih cenderung untuk melakukannya.
Satu cara mudah untuk melakukan ini adalah untuk membuat direktori cangkuk dan pemasangan pemasangan pemasangan yang mudah.
applypatch-msg.sample commit-msg.sample post-update.sample pre-applypatch.sample pre-commit pre-commit.sample prepare-commit-msg.sample pre-push.sample pre-rebase.sample update.sampleSesiapa yang klon projek anda hanya boleh menjalankan bassults.sh bashs.sh selepas pengklonan.
Ini juga mempunyai manfaat untuk menjaga cangkuk anda di bawah kawalan versi.
cangkuk lain
3 Berikut adalah satu dalam php:
<span>cd .git/hooks </span><span>touch pre-commit </span><span>chmod +x pre-commit</span>
Kesimpulan
cangkuk git adalah cara yang kuat untuk mengautomasikan aliran kerja projek anda. Anda boleh mengesahkan kod, membuat mesej, memastikan persekitaran adalah betul, dan lebih banyak lagi. Adakah terdapat sesuatu yang menarik untuk anda menggunakan cangkuk git? Beritahu kami dalam komen!<span>#!/usr/bin/env bash </span><span># Hook that checks PHP syntax </span> <span># Override IFS so that spaces do not count as delimiters </span><span>old_ifs=$IFS </span><span><span>IFS</span>=$'<span title="\n">\n'</span> </span> <span># Always fail </span><span>exit 1</span>
Apakah jenis cangkuk git yang berlainan? Cangkuk sisi klien dicetuskan oleh operasi seperti melakukan dan menggabungkan, sementara cangkuk sisi pelayan dijalankan pada operasi rangkaian seperti menerima komitmen yang ditolak. Setiap cangkuk boleh disesuaikan untuk memenuhi keperluan operasi khusus anda.
Bolehkah saya berkongsi cangkuk git dengan pasukan saya? Ini kerana ia disimpan dalam direktori .GIT, yang tidak versi. Walau bagaimanapun, anda boleh membagikannya dengan pasukan anda dengan menyimpannya dalam direktori berasingan dalam projek anda dan membuat skrip untuk menghidupkannya ke dalam. >
cangkuk git boleh digunakan untuk menguatkuasakan dasar projek atau syarikat. Contohnya, anda boleh menggunakan cangkuk pra-penerima di sisi pelayan untuk menolak sebarang dorongan yang tidak mematuhi dasar anda (mis., Bermula yang tidak mengikuti format tertentu).cangkuk git adalah skrip, jadi anda boleh menulisnya dalam bahasa skrip. Sampel lalai ditulis dalam bash, tetapi anda boleh menggunakan bahasa yang anda selesa dengan, seperti python atau ruby.
Bagaimana saya boleh debug cangkuk git? Debugging cangkuk git boleh dilakukan dengan menulis maklumat ke fail dari skrip cangkuk. Sebagai contoh, anda boleh mengalihkan output arahan ke fail log untuk memeriksa kemudian. komit, anda boleh menggunakan pilihan-no-verifikasi dengan arahan komit git. Ini boleh berguna apabila anda menjalankan perubahan kecil yang tidak memerlukan cek yang dilaksanakan di cangkuk anda. berkuasa, mereka harus digunakan dengan berhati -hati. Cangkuk yang kurang ditulis boleh menyebabkan masalah, termasuk menolak semua komitmen atau kehilangan data. Sentiasa menguji cangkuk anda dengan teliti sebelum menggunakannya.
Atas ialah kandungan terperinci Pengenalan cangkuk git. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!