Menerapkan hook git post-commit ke semua repo saat ini dan di masa depan

275

Saya telah menulis hook pasca-komit Git dan berfungsi dengan benar. Namun, saya ingin menambahkan kait ini untuk diterapkan ke semua repositori git saat ini (dan masa depan) yang sedang saya kerjakan. Saya mencoba menambahkan hook ke saya ~/.git/hooks/daripada di direktori hook di direktori proyek, namun, ini sepertinya tidak berhasil.

Apakah ada cara untuk membuat kait Git global yang akan berlaku untuk semua repositori di sistem saya (tanpa harus menyalinnya ke setiap direktori proyek)? Jika tidak, apa solusi terbaik ke depan - mungkin templat git-init?

Swanson
sumber
3
Pada Git 2.9 pendekatan terbaik untuk ini telah berubah: jawaban VonC adalah taruhan yang lebih baik. stackoverflow.com/a/37293198/2741954
Simon Brahan
Apakah ini menjawab pertanyaan Anda? ganti default git hook
Oliver Sieweke

Jawaban:

192

Saya ingin menambahkan kait ini untuk diterapkan ke semua repositori git saat ini (dan masa depan) yang sedang saya kerjakan

Dengan git 2.9+ (Juni 2016), yang akan Anda lakukan adalah:

git config --global core.hooksPath /path/to/my/centralized/hooks

Lihat " ubah kait git default ": ini telah dilakukan untuk mengelola kait terpusat.

VONC
sumber
jika saya memiliki repo yang ada dan ingin semua pengembang lain yang menarik perubahan memiliki kait pra-komitmen yang diperbarui misalnya bagaimana saya melakukan ini? terima kasih
Richlewis
@ Richlewis maksud Anda stackoverflow.com/a/40550555/6309 tidak sepenuhnya jelas?
VonC
@Richlewis Anda perlu mengatur folder bersama yang dapat diakses oleh semua pengembang, agar mereka dapat referensi dalam konfigurasi lokal mereka sendiri.
VonC
sayangnya saya masih belum mengerti. dalam repo ada yang /.git/hooks/pre_commitbisa saya tunjukkan itu?
Richlewis
@Richlewis saya telah menjawab Anda pada pertanyaan awal Anda.
VonC
290

Pada git 1.7.1, Anda dapat mengatur init.templatedir di gitconfig Anda untuk memberi tahu git ke mana harus mencari templat.

Atur seperti ini:

git config --global init.templatedir '~/.git_template'

Setelah itu, repositori baru yang Anda buat atau tiru akan menggunakan direktori ini untuk template. Tempatkan kait yang Anda inginkan ~/.git_template/hooks. Repositori yang ada dapat diinisialisasi ulang dengan templat yang sesuai dengan menjalankan git initdirektori yang sama .git.

Untuk versi git yang lebih tua dari 1.7.1, menjalankan git init --template ~/.git_templateakan berfungsi jika Anda seperti saya dan masih ingin mengelola .git_templatedir Anda bersama dengan sisa file dot Anda. Anda juga dapat menggunakan $GIT_TEMPLATE_DIRlingkungan untuk mengetahui di git initmana direktori templat Anda berada.

sklnd
sumber
51
Jawaban yang bagus Jika ada orang lain yang bertanya-tanya apakah menjalankan ulang git initrepo yang ada menghapusnya - itu tidak , lihat: stackoverflow.com/questions/5149694/…
kontur
Bagi saya itu tidak bekerja dengan path relatif ke folder template git untuk menyalin file menggunakan git init pada repositori yang ada. Saya telah menggunakan path lengkap sebagai gantinya.
user847988
1
Pada windows tanpa kutip: `git config --global init.templatedir d: \ git \ .git_template \`
Vladimir Vukanac
1
Tip: Kait templat disalin. Jika Anda ingin dapat memperbarui global hooks bersama-sama, pasang hook di tempat lain dan tambahkan tautan simbolik di direktori templat (di Linux). Pastikan jalur tautannya absolut.
Tim Allclair
1
Menjalankan git initsebenarnya tidak memperbarui kait untuk saya. Sepertinya tidak akan menimpa file yang sudah ada. stackoverflow.com/questions/10791486/ . Alih-alih, Anda harus menghapus file hook lama terlebih dahulu.
Phil R
69

Jika Anda menginginkannya di mana saja di sistem Anda (termasuk pengguna di samping Anda), Anda dapat memodifikasi konten direktori templat yang diinstal - yang ada di dalamnya $PREFIX/share/git-core/templates/hooks, di mana $PREFIXmungkin /usr/localatau /usr.

Jika Anda ingin ini hanya untuk Anda, maka ya, hal paling sederhana adalah --templatepilihan git-init. Anda dapat dengan mudah menyimpan direktori templat pribadi yang memiliki symlink kembali ke versi terinstal default yang ingin Anda pertahankan (kait individu, direktori info ...) dan kemudian konten Anda sendiri hooks/post-commitdan apa pun yang ingin Anda sesuaikan.

Cascabel
sumber
11
Terima kasih, ini berhasil dengan baik. Dan untuk menerapkannya secara surut ke proyek-proyek saya yang sudah ada, saya hanya berlari git initlagi dan menambahkan kait baru saya.
Swanson
Ini adalah solusi yang rapi, tetapi Anda harus mengubah semua repo. Ini layak, tetapi bukankah ada kemungkinan dengan plugin atau sesuatu (ini adalah bagaimana hal itu dilakukan di Bazaar)?
Martin Ueding
2
Untuk git yang disematkan SourceTree pada OS X, mereka ada di/Applications/SourceTree.app/Contents/Resources/git_local/share/git-core/templates/hooks
CupawnTae
1
Untuk Windows ini ditemukan di direktori install git di bawah mingw64\share\templates\hooks(atau mingw32 untuk 32-bit)
nerdherd
1
@nerdherd sekarang di mingw64\share\git-core\templates\hooks(gfw 2.25)
RJFalconer
7

Pendekatan minimalis adalah membuat git_hooks/direktori di repositori Anda untuk melacak kait yang Anda tulis untuk proyek itu, membawanya ke perhatian pengguna di masa depan dengan menyebutkannya dalam a README, dan mengandalkan mereka untuk melakukan hal yang benar setelah mereka dikloning. Saya telah merenungkan hal ini untuk sementara waktu dan memilih pendekatan tambahan. Di ujung jalan saya mungkin mempertimbangkan menggunakan alat seperti git-hooks .

Neil Terbaik
sumber
1
Ini sangat, sangat jauh dari solusi nyata yang harus saya hilangkan, maaf.
Victor Schröder