Apakah ini dianggap sebagai praktik yang buruk - untuk menempatkan .git / kait ke repositori proyek (menggunakan symlink, misalnya). Jika ya, apa cara terbaik untuk mengirimkan kait yang sama ke pengguna git yang berbeda?
Saya umumnya setuju dengan Scytale, dengan beberapa saran tambahan, cukup bahwa itu bernilai jawaban terpisah.
Pertama, Anda harus menulis skrip yang menciptakan symlink yang sesuai, terutama jika kaitan ini adalah tentang menegakkan kebijakan atau membuat pemberitahuan yang bermanfaat. Orang-orang akan lebih mungkin menggunakan kait jika mereka bisa mengetik bin/create-hook-symlinks
daripada jika harus melakukannya sendiri.
Kedua, menghubungkan kait secara langsung mencegah pengguna menambahkan kait pribadi mereka sendiri. Sebagai contoh, saya lebih suka contoh pre-commit hook yang memastikan saya tidak memiliki kesalahan spasi putih. Cara terbaik untuk melakukannya adalah dengan memasukkan skrip pembungkus kait ke dalam repo Anda, dan menghubungkan semua kait ke skrip tersebut. Wrapper kemudian dapat memeriksa $0
(dengan asumsi itu adalah skrip bash; yang setara seperti argv[0]
sebaliknya) untuk mengetahui hook mana yang dipanggil, kemudian memanggil hook yang sesuai dalam repo Anda, serta hook pengguna yang sesuai, yang harus diganti namanya , melewati semua argumen untuk masing-masing. Contoh cepat dari memori:
#!/bin/bash
if [ -x $0.local ]; then
$0.local "$@" || exit $?
fi
if [ -x tracked_hooks/$(basename $0) ]; then
tracked_hooks/$(basename $0) "$@" || exit $?
fi
Skrip instalasi akan memindahkan semua kait yang sudah ada sebelumnya ke samping (tambahkan .local
ke nama mereka), dan menghubungkan semua nama kait yang dikenal ke skrip di atas:
#!/bin/bash
HOOK_NAMES="applypatch-msg pre-applypatch post-applypatch pre-commit prepare-commit-msg commit-msg post-commit pre-rebase post-checkout post-merge pre-receive update post-receive post-update pre-auto-gc"
# assuming the script is in a bin directory, one level into the repo
HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
for hook in $HOOK_NAMES; do
# If the hook already exists, is executable, and is not a symlink
if [ ! -h $HOOK_DIR/$hook -a -x $HOOK_DIR/$hook ]; then
mv $HOOK_DIR/$hook $HOOK_DIR/$hook.local
fi
# create the symlink, overwriting the file if it exists
# probably the only way this would happen is if you're using an old version of git
# -- back when the sample hooks were not executable, instead of being named ____.sample
ln -s -f ../../bin/hooks-wrapper $HOOK_DIR/$hook
done
chmod +x .git/hooks/*
Andabin/create-hook-symlinks
untuk mengerjakannya.HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
.Tidak, memasukkan mereka ke dalam repositori baik-baik saja, saya bahkan menyarankan melakukannya (jika mereka juga berguna bagi orang lain). Pengguna harus mengaktifkannya secara eksplisit (seperti yang Anda katakan, misalnya dengan menghubungkan), yang pada satu sisi sedikit menyakitkan, tetapi melindungi pengguna di sisi lain dari menjalankan kode arbitrer tanpa persetujuan mereka.
sumber
Saat ini Anda dapat melakukan hal berikut untuk menetapkan direktori yang berada di bawah kontrol versi menjadi direktori git kait Anda, misalnya,
MY_REPO_DIR/.githooks
akanMasih tidak dapat diberlakukan secara langsung tetapi, jika Anda menambahkan catatan di README Anda (atau apa pun), ini membutuhkan upaya minimal pada setiap bagian pengembang.
sumber
Dari http://git-scm.com/docs/git-init#_template_directory , Anda dapat menggunakan salah satu dari mekanisme ini untuk memperbarui dir .git / hooks dari setiap repo git yang baru dibuat:
sumber
Simpan di proyek dan instal di build
Seperti yang dinyatakan orang lain dalam jawaban mereka, Jika kait Anda spesifik untuk proyek-proyek tertentu, maka sertakan dalam proyek itu sendiri, yang dikelola oleh git. Saya akan mengambil ini lebih jauh dan mengatakan bahwa, mengingat itu adalah praktik yang baik untuk membangun proyek Anda menggunakan skrip atau perintah tunggal, kait Anda harus dipasang selama pembangunan.
Saya menulis artikel tentang mengelola kait git , jika Anda tertarik untuk membaca tentang ini lebih dalam lagi.
Java & Maven
Penafian penuh; Saya menulis plugin Maven yang dijelaskan di bawah ini.
Jika Anda menangani build management dengan Maven untuk proyek Java Anda, plugin Maven berikut ini menangani pemasangan kait dari lokasi di proyek Anda.
https://github.com/rudikershaw/git-build-hook
Masukkan semua kait Git Anda ke direktori di proyek Anda, lalu konfigurasikan Anda
pom.xml
untuk menyertakan deklarasi, tujuan, dan konfigurasi plugin berikut.Ketika Anda menjalankan proyek Anda, membangun plugin akan mengonfigurasi git untuk menjalankan hook dari direktori yang ditentukan. Ini akan secara efektif mengatur kait di direktori itu untuk semua orang yang mengerjakan proyek Anda.
JavaScript & NPM
Untuk NPM ada ketergantungan yang disebut Husky yang memungkinkan Anda untuk menginstal kait termasuk yang ditulis dalam JavaScript.
Lainnya
Selain itu, ada pra-komit untuk proyek Python, Overcommit untuk proyek Ruby, dan Lefthook untuk proyek Ruby atau Node.
sumber
Paket https://www.npmjs.com/package/pre-commit npm menangani ini dengan elegan yang memungkinkan Anda menentukan kait pra-komit di package.json Anda.
sumber
Inilah skrip, add-git-hook.sh, yang dapat Anda kirimkan sebagai file biasa di repositori dan dapat dieksekusi untuk menambahkan kait git ke file skrip. Sesuaikan kait mana yang akan digunakan (pra-komit, pasca-komit, pra-dorong, dll.) Dan definisi kait dalam heredoc kucing.
Skrip ini mungkin masuk akal untuk memiliki izin yang dapat dieksekusi atau pengguna dapat menjalankannya secara langsung. Saya menggunakan ini untuk secara otomatis git-pull pada mesin lain setelah saya berkomitmen.
EDIT - Saya menjawab pertanyaan yang lebih mudah yang bukan apa yang diminta dan bukan apa yang dicari OP. Saya berpendapat tentang kasus penggunaan dan argumen untuk skrip pengiriman kait di repo versus mengelola mereka secara eksternal di komentar di bawah ini. Semoga itu lebih apa yang Anda cari.
sumber
Untuk proyek-proyek PHP berbasis Komposer, Anda dapat secara otomatis mendistribusikan ke para insinyur. Berikut adalah contoh untuk kait pre-commit dan commit-msg.
Buat
hooks
folder, lalu di composer.json Anda:Kemudian Anda bahkan dapat memperbaruinya saat proyek berlanjut karena semua orang berjalan
composer install
secara teratur.sumber
Anda dapat menggunakan solusi terkelola untuk manajemen kait pra-komitmen seperti pra-komitmen . Atau solusi terpusat untuk git-hook sisi-server seperti Datree.io . Ini memiliki kebijakan bawaan seperti:
Itu tidak akan mengganti semua kait Anda, tetapi mungkin membantu pengembang Anda dengan yang paling jelas tanpa konfigurasi neraka menginstal kait pada setiap komputer pengembang / repo.
Penafian: Saya adalah salah satu pendiri Datrees
sumber