Saya membuat hook pasca-penggabungan kustom saya sendiri, sekarang saya menambahkan direktori "hooks" ke folder proyek utama saya (karena git tidak melacak perubahan dalam .git / hooks), di suatu tempat saya membaca bahwa saya dapat membuat link simbolis dari hooks ke .git / hooks jadi saya tidak perlu menyalin file dari satu folder ke folder lain setiap kali seseorang mengubahnya jadi saya mencoba:
ln -s -f hooks/post-merge .git/hooks/post-merge
Tapi sepertinya tidak berhasil, ada ide mengapa? "ln hooks / post-merge .git / hooks / post-merge" berfungsi dengan baik tetapi membuat hard link sama dengan copyin saya kira ....
.git/hooks/
poin itu untukhooks/post-merge
diselesaikan.git/hooks/hooks/post-merge
, yang tidak ada. Kamu mauln -s -f ../../hooks/post-merge .git/hooks/post-merge
. Atau membuat hidup Anda lebih mudah:ln -s -f ../hooks .git/hooks
. Masalah Anda tidak ada hubungannya dengan git..git/hooks
.Jawaban:
Anda baru saja menggunakan jalan yang salah, seharusnya:
sumber
cd
. Bukankah seharusnya begituln -s ./hooks/
?.git/hooks
direktori kerjanya, jadi jalur relatif harus relatif terhadap direktori itu. Ini lebih jelas jika Anda terlebih dahulucd
masuk.git/hooks
sebelum membuat symlink, dan mencari tahu jalur relatif dari sana.ln
akan disimpan sebagai target dan diselesaikan relatif terhadap lokasi tautan.cd
masuk ke.git/hooks
sebelum Anda membuat tautan akan membantu Anda menulis perintah, karena Anda kemudian dapat melengkapi otomatis ke jalur yang benar.prepare-commit-msg
. Masalahnya adalah jika saya mengedit pesan komit menggunakan nano, lalu Ctl + X keluar untuk membatalkan, git tetap menyelesaikan komit alih-alih membatalkan seperti dulu sebelum saya membuat perubahan ini. Adakah cara agar nano keluar tanpa menyebabkan komit ini selesai?Meskipun Anda dapat menggunakan tautan simbolik, Anda juga dapat mengubah folder kait untuk proyek Anda di pengaturan git dengan:
Yang bersifat lokal secara default sehingga tidak akan merusak git hooks untuk proyek Anda yang lain. Ini berfungsi untuk semua hook di repositori ini, jadi ini sangat berguna jika Anda memiliki lebih dari satu hook.
Jika Anda sudah memiliki pengait khusus
.git/hooks/
yang tidak ingin Anda bagikan dengan tim Anda, Anda dapat menambahkannya di pengait / dan menambahkannya.gitignore
agar tidak dibagikan.sumber
Mengubah direktori sebelum menautkan
sumber
cd
:ln -s -f ../../hooks/post-merge
Perhitungan jalur dilakukan relatif terhadap symlink. Mari kita pahami menggunakan contoh,
ln -s path/to/file symlink/file
Di sini, jalur ke file seharusnya merupakan jalur relatif dari jalur symlink.
Sistem sebenarnya menghitung jalur file sebagai
symlink/path/path/to/file
Perintah di atas harus ditulis ulang sebagai
ln -s ../path/to/file symlink/path
Struktur folder,
sumber
Memanfaatkan komentar Michael Cihar, berikut adalah contoh script bash yang saya tulis untuk membuat symlink tersebut. Skrip ini terletak di git_hooks / dir yang ada di root proyek. Folder .git / saya juga berada di tingkat direktori yang sama.
Skrip saya harus dijalankan dari dalam direktori git_hooks / sebenarnya. Anda dapat memodifikasinya agar berperilaku berbeda, jika Anda mau.
Skrip ini akan menghubungkan file apa pun yang tidak memiliki ekstensi file dalam direktori git_hooks /. Saya memiliki README.txt di direktori ini + skrip ini (bernama symlink.sh). Semua git hook yang sebenarnya diberi nama 'pre-commit', 'pre-push', dll. Sehingga mereka akan terhubung dengan symlink.
sumber
mengapa tidak hanya cp ./hooks/* .git / hooks /
ini berhasil untuk saya di Mac OS
sumber
I don't have to copy the file from one folder to the other every time someone changes