Rumah >Peranti teknologi >industri IT >Pengenalan cangkuk git

Pengenalan cangkuk git

Christopher Nolan
Christopher Nolanasal
2025-02-21 08:58:11932semak imbas

3

Takeaways Key An Introduction to Git Hooks

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. Pengenalan cangkuk git

Dua jenis cangkuk wujud: sisi klien, yang dijalankan pada sistem pemaju, dan sisi pelayan, yang dijalankan pada pelayan yang menganjurkan repositori git.

cangkuk git tidak diedarkan dengan projek anda dan tidak boleh dipasang secara automatik, jadi ia memberi manfaat untuk mewujudkan tempat untuk cangkuk anda untuk hidup dan memberitahu kolaborator anda untuk menggunakannya. pihak klien-ini dijalankan pada sistem pemaju

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.

    fail cangkuk
  • Setiap repositori termasuk yang anda klon secara lalai akan mempunyai cangkuk contoh dalam direktori .git/cangkuk:
Dalam direktori itu, anda akan melihat sesuatu seperti:

kami akan memberi tumpuan kepada cangkuk pra-komit yang berjalan sebelum membenarkan komit.

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:

  • php_files = dalam tugasan bash dilakukan tanpa pembatas tetapi ambil perhatian bahawa merujuk pembolehubah memerlukan $ pembatas
  • $ () adalah sintaks untuk 'mendapatkan output'. Petikan tidak diperlukan untuk menggunakan ini.
  • grep sedang digunakan untuk memeriksa (a) dan fail yang diubah suai (m)
  • AWK sedang digunakan di sini untuk mencetak $ 2. Status Git Lengkap -Line -short mempunyai ruang tambahan dan data tambahan pada mulanya, jadi kami mahu mengeluarkannya. AWK juga melakukan pelucutan automatik.
  • grep sekali lagi digunakan, tetapi sekarang sedang memeriksa untuk memastikan garisan berakhir di .php
  • sekarang kita dapat mengesahkan setiap fail dengan gelung:

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.

Perkongsian cangkuk

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.sample
Sesiapa 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

    menyediakan komitmen-msg-menyediakan mesej komit lalai jika tidak diberikan.
  • Commit-Msg-Pengesahan mesej komit.
  • post-commit-berjalan selepas komitmen yang berjaya.
  • Pra-PUSH-berjalan sebelum push git selepas alat kawalan jauh disahkan berfungsi. Ia mengambil 2 argumen: nama jauh, dan url kepadanya.
  • pra-rebase-berjalan sebelum git rebase.
  • Post-checkout-berjalan selepas checkout yang berjaya.
  • post-mere-berjalan selepas gabungan yang berjaya.
cangkuk ini umumnya berfungsi sama seperti pra-komit walaupun mereka mengambil argumen. Satu kes penggunaan untuk pasca pemeriksaan adalah untuk memastikan bahawa fail sentiasa mendapat kebenaran yang betul (kerana git hanya menjejaki boleh dilaksanakan, tidak boleh dilaksanakan dan pautan simbolik):

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>

Soalan Lazim (Soalan Lazim) Mengenai Cangkuk Git

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.

Bagaimana saya membuat cangkuk git? Di sini, anda akan dapati skrip sampel untuk pelbagai cangkuk. Untuk membuat cangkuk baru, buat fail tanpa sebarang pelanjutan (contohnya, pra-komit

Bagaimana saya boleh menggunakan cangkuk git untuk automasi? Sebagai contoh, anda boleh menggunakan cangkuk pra-komit untuk menjalankan ujian secara automatik atau linter pada kod anda sebelum setiap komit. Ini memastikan bahawa hanya diuji dan kod diformat yang betul komited ke repositori.

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).

Bahasa apa Bolehkah saya gunakan untuk menulis cangkuk git?

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.

Bolehkah saya menggunakan cangkuk git untuk diintegrasikan dengan alat lain? Cangkuk git boleh digunakan untuk mengintegrasikan Git dengan alat lain. Sebagai contoh, anda boleh menggunakan cangkuk pasca komitmen untuk mencetuskan membina pelayan integrasi berterusan anda atau mengemas kini tiket dalam sistem pengesanan isu anda.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn