Jawaban:
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
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.
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
akan
git config --local core.hooksPath .githooks/
Masih tidak dapat diberlakukan secara langsung tetapi, jika Anda menambahkan catatan di README Anda (atau apa pun), ini membutuhkan upaya minimal pada setiap bagian pengembang.
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:
Direktori templat berisi file dan direktori yang akan disalin ke $ GIT_DIR setelah dibuat.
Direktori templat akan menjadi salah satu dari yang berikut ini (secara berurutan):
argumen yang diberikan dengan opsi --template;
isi dari variabel lingkungan $ GIT_TEMPLATE_DIR;
variabel konfigurasi init.templateDir; atau
direktori templat default: / usr / share / git-core / templates.
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.
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.
<build>
<plugins>
<plugin>
<groupId>com.rudikershaw.gitbuildhook</groupId>
<artifactId>git-build-hook-maven-plugin</artifactId>
<configuration>
<gitConfig>
<!-- The location of the directory you are using to store the Git hooks in your project. -->
<core.hooksPath>hooks-directory/</core.hooksPath>
</gitConfig>
</configuration>
<executions>
<execution>
<goals>
<!-- Sets git config specified under configuration > gitConfig. -->
<goal>configure</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- ... etc ... -->
</plugins>
</build>
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.
Untuk NPM ada ketergantungan yang disebut Husky yang memungkinkan Anda untuk menginstal kait termasuk yang ditulis dalam JavaScript.
// package.json
{
"husky": {
"hooks": {
"pre-commit": "npm test",
"pre-push": "npm test",
"...": "..."
}
}
}
Selain itu, ada pra-komit untuk proyek Python, Overcommit untuk proyek Ruby, dan Lefthook untuk proyek Ruby atau Node.
Paket https://www.npmjs.com/package/pre-commit npm menangani ini dengan elegan yang memungkinkan Anda menentukan kait pra-komit di package.json Anda.
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.
#!/usr/bin/bash
# Adds the git-hook described below. Appends to the hook file
# if it already exists or creates the file if it does not.
# Note: CWD must be inside target repository
HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
HOOK_FILE="$HOOK_DIR"/post-commit
# Create script file if doesn't exist
if [ ! -e "$HOOK_FILE" ] ; then
echo '#!/usr/bin/bash' >> "$HOOK_FILE"
chmod 700 "$HOOK_FILE"
fi
# Append hook code into script
cat >> "$HOOK_FILE" <<EOF
########################################
# ... post-commit hook script here ... #
########################################
EOF
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.
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:
},
"scripts": {
"post-install-cmd": [
"cp -r 'hooks/' '.git/hooks/'",
"php -r \"copy('hooks/pre-commit', '.git/hooks/pre-commit');\"",
"php -r \"copy('hooks/commit-msg', '.git/hooks/commit-msg');\"",
"php -r \"chmod('.git/hooks/pre-commit', 0777);\"",
"php -r \"chmod('.git/hooks/commit-msg', 0777);\"",
],
Kemudian Anda bahkan dapat memperbaruinya saat proyek berlanjut karena semua orang berjalan composer install
secara teratur.
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
chmod +x .git/hooks/*
Andabin/create-hook-symlinks
untuk mengerjakannya.