Áp dụng hook git post-commit cho tất cả các repos hiện tại và tương lai


275

Tôi đã viết một hook post-commit hook và nó hoạt động chính xác. Tuy nhiên, tôi muốn thêm hook này để áp dụng cho tất cả các kho git hiện tại (và tương lai) mà tôi đang làm việc. Tôi đã thử thêm hook vào ~/.git/hooks/thay vì trong thư mục hook trong thư mục dự án, tuy nhiên, điều này dường như không hoạt động.

Có cách nào để tạo các hook Git toàn cầu sẽ áp dụng cho tất cả các kho lưu trữ trên hệ thống của tôi (mà không phải sao chép chúng vào từng thư mục dự án) không? Nếu không, điều gì sẽ là giải pháp tốt nhất trong tương lai - có lẽ là một mẫu git-init?


3
Kể từ Git 2.9, cách tiếp cận tốt nhất này đã thay đổi: Câu trả lời của VonC là đặt cược tốt hơn. stackoverflow.com/a/37293198/2741954
Simon Brahan

Điều này có trả lời câu hỏi của bạn không? thay đổi móc git mặc định
Oliver Sieweke

Câu trả lời:


192

Tôi muốn thêm hook này để áp dụng cho tất cả các kho git hiện tại (và tương lai) mà tôi đang làm việc

Với git 2.9+ (tháng 6 năm 2016), tất cả những gì bạn sẽ làm là:

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

Xem " thay đổi móc git mặc định ": điều này đã được thực hiện để quản lý các móc tập trung.


nếu tôi có một repo hiện tại và muốn tất cả các nhà phát triển khác thay đổi để có một hook pre-commit được cập nhật, ví dụ tôi sẽ làm điều này như thế nào? cảm ơn bạn
Richlewis

@Richlewis bạn có nghĩa là stackoverflow.com/a/40550555/6309 không hoàn toàn rõ ràng?
VonC

@Richlewis Bạn sẽ cần thiết lập một thư mục dùng chung có thể truy cập bởi tất cả các nhà phát triển, để họ tham chiếu trong cấu hình cục bộ của riêng họ.
VonC

tiếc là tôi vẫn không hiểu lắm. Trong repo có /.git/hooks/pre_committôi có thể chỉ nó không?
Richlewis

@Richlewis Tôi đã trả lời bạn về câu hỏi ban đầu của bạn.
VonC

290

Kể từ git 1.7.1, bạn có thể đặt init.templatedir trong gitconfig để báo cho git biết nơi cần tìm mẫu.

Đặt nó như thế này:

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

Sau đó, các kho lưu trữ mới mà bạn tạo hoặc sao chép sẽ sử dụng thư mục này cho các mẫu. Đặt móc bạn muốn vào ~/.git_template/hooks. Các kho lưu trữ hiện có có thể được khởi tạo lại với các mẫu thích hợp bằng cách chạy git inittrong cùng thư mục.git .

Đối với các phiên bản git cũ hơn 1.7.1, việc chạy git init --template ~/.git_templatesẽ hoạt động nếu bạn giống tôi và vẫn muốn quản lý .git_templatethư mục của bạn cùng với phần còn lại của các tệp chấm của bạn. Bạn cũng có thể sử dụng $GIT_TEMPLATE_DIRmôi trường để cho biết git initthư mục mẫu của bạn ở đâu.


51
Câu trả lời chính xác. Nếu bất kỳ ai khác tự hỏi liệu có chạy lại git inittrên một repo hiện tại sẽ xóa sạch nó không - hãy xem: stackoverflow.com/questions/5149694/
Lỗi

Đối với tôi nó không hoạt động với đường dẫn tương đối đến thư mục mẫu git để sao chép tệp bằng git init trên kho lưu trữ hiện có. Tôi đã sử dụng đường dẫn đầy đủ thay thế.
dùng847988

1
Trên các cửa sổ không có trích dẫn: `git config --global init.templatedir d: \ git \ .git_template \`
Vladimir Vukanac

1
Mẹo: Các móc mẫu được sao chép. Nếu bạn muốn có thể cập nhật các hook toàn cầu với nhau, hãy đặt hook ở nơi khác và thêm một liên kết tượng trưng trong thư mục mẫu (trên Linux). Hãy chắc chắn rằng đường dẫn liên kết là tuyệt đối.
Tim Allclair

1
Chạy git initkhông thực sự cập nhật các hook cho tôi. Có vẻ như nó sẽ không ghi đè lên các tập tin đã có. stackoverflow.com/questions/10791486/ . Thay vào đó, bạn cần loại bỏ các tập tin hook cũ trước.
Phil R

69

Nếu bạn muốn chúng ở mọi nơi trên hệ thống của bạn (bao gồm cả người dùng bên cạnh bạn), bạn có thể sửa đổi nội dung của thư mục mẫu đã cài đặt - những thứ đó có trong $PREFIX/share/git-core/templates/hooks, nơi $PREFIXcó thể /usr/localhoặc/usr .

Nếu bạn muốn điều này chỉ dành cho bạn, thì có, điều đơn giản nhất sẽ là --templatetùy chọn của git-init. Bạn có thể dễ dàng giữ một thư mục mẫu cá nhân có các liên kết trở lại phiên bản mặc định đã cài đặt mà bạn muốn giữ (các móc riêng lẻ, thư mục thông tin ...) và sau đó nội dung của riêng bạn hooks/post-commitvà bất cứ thứ gì bạn muốn tùy chỉnh.


11
Cảm ơn, điều này làm việc tốt. Và để áp dụng hồi tố nó cho các dự án hiện tại của tôi, tôi chỉ cần chạy git initlại và nó đã thêm móc mới của tôi.
swanson

Đây là một cách giải quyết gọn gàng, nhưng nó sẽ yêu cầu bạn thay đổi tất cả các repos của mình. Điều này là khả thi, nhưng không có khả năng với một plugin hoặc thứ gì đó (đây là cách nó được thực hiện tại Bazaar)?
Martin Uting

2
Đối với git nhúng của SourceTree trên OS X, họ đang ở/Applications/SourceTree.app/Contents/Resources/git_local/share/git-core/templates/hooks
CupawnTae

1
Đối với Windows, phần này được tìm thấy trong thư mục cài đặt git trong mingw64\share\templates\hooks(hoặc mingw32 cho 32-bit)
nerdherd

1
@nerdherd bây giờ là lúc mingw64\share\git-core\templates\hooks(gfw 2.25)
RJFalconer

7

Cách tiếp cận tối giản là tạo một git_hooks/thư mục trong kho lưu trữ của bạn để theo dõi các hook mà bạn viết cho dự án đó, đưa nó đến sự chú ý của người dùng trong tương lai bằng cách đề cập đến nó READMEvà dựa vào chúng để thực hiện đúng sau khi chúng được sao chép. Tôi đã đồng cảm với điều này trong một thời gian và chọn một cách tiếp cận gia tăng. Xuống đường tôi có thể cân nhắc sử dụng một công cụ như git-hook .


1
Điều này là như vậy, rất xa để trở thành một giải pháp thực sự mà tôi đã phải downvote, xin lỗi.
Victor Schröder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.