Trong một hook git, thư mục làm việc hiện tại có được đảm bảo nằm trong kho lưu trữ git không?


81

Theo kinh nghiệm, có vẻ như git hooks được chạy với thư mục hiện tại được đặt làm thư mục gốc của kho lưu trữ. Tuy nhiên, tôi không thể thấy bất kỳ đảm bảo nào về điều đó trong tài liệu git. Tôi có nên dựa vào thư mục làm việc hiện tại để tìm kho lưu trữ git hay có cách nào tốt hơn để tìm kho lưu trữ git được liên kết với hook không?


4
Không chắc chắn rằng có bao nhiêu liên quan. Trên hộp ổn định Gentoo với Git 2.7.3 (-r1), các hook git không chỉ được thực thi .gitmà còn git reset --hardthực sự tạo ra cấu trúc thư mục làm việc bên trong .gitthư mục, theo tôi là một việc hoàn toàn sai lầm!
Pavel Šimerda 29/10/16

Câu trả lời:


45

Nó dựa trên giá trị được đặt cho biến môi trường GIT_DIR. Nó được đặt thành gốc của kho lưu trữ khi hook bắt đầu chạy. Nhiều hook, đặc biệt là những hook thực hiện pull từ repo khác, bỏ đặt (và đặt lại) biến môi trường này nếu cần.


6
$ GIT_DIR có dấu gạch chéo không?
PuercoPop

8
Đây KHÔNG phải là một câu trả lời chính xác. GIT_DIR KHÔNG luôn được đặt thành gốc của repo. Xem blog này .
Ghopper 21

2
@ Ghopper21 Bài báo đó cũng không đúng hoàn toàn. Nó nói rằng đối với hook post-commit, thư mục hiện tại là cấp cao nhất của cây làm việc. Tuy nhiên, tập lệnh post-commit rất đơn giản của tôi không tìm thấy các tập lệnh khác ở cấp cao nhất của cây làm việc. ví dụ:.git/hooks/post-commit: 1: .git/hooks/post-commit: post-commit_push_gitweb.sh: not found
Vince

67

Các câu trả lời hiện tại dường như đã lỗi thời. Kể từ 2.9.0, tài liệu nêu rõ như sau:

Trước khi Git gọi ra một hook, nó sẽ thay đổi thư mục làm việc của nó thành thư mục gốc của cây làm việc trong một kho lưu trữ không trần hoặc thành $ GIT_DIR trong một kho lưu trữ trống.

https://git-scm.com/docs/githooks/2.9.0


11
Câu trả lời chính xác. Việc làm rõ đã được thực hiện trong các bản sửa đổi sau này (2.13.0). "Một ngoại lệ là các móc được kích hoạt trong quá trình đẩy (nhận trước, cập nhật, sau nhận, sau cập nhật, đẩy để thanh toán) luôn được thực thi trong $ GIT_DIR."
Novice C

2
Nguồn / ngữ cảnh cho câu trích dẫn ở trên: git-scm.com/docs/githooks#_description
jmcker

Bằng ngôn ngữ đơn giản: đó là thư mục cấp cao nhất của kho lưu trữ của bạn. ("Bare" về cơ bản đề cập đến một kho lưu trữ chỉ bao gồm .gitthư mục và không có tệp nào được kiểm tra.)
Ben Mares

4

Bạn có thể sử dụng biến môi trường $GIT_DIR. $GIT_DIRđiểm vào .gitthư mục.


Khả năng nó $GIT_DIR/..sẽ trỏ đến gốc của kho lưu trữ là bao nhiêu?
David Lord

Nó không phải là dễ dàng. Không sử dụng $GIT_DIR/... Điều đó sẽ bị phá vỡ khi repo là một repo trần. Một kho lưu trữ trống không có thư mục hoạt động do đó không có "gốc kho lưu trữ". Ngoài ra, nó sẽ bị hỏng khi .git là một liên kết thay thế.
Holygeek

1
Hình dung. Có cách nào để lấy repo root theo cách sử dụng bình thường không? Ví dụ: đối với hook pre-commit sử dụng repo làm tệp cấu hình cho một chương trình?
David Lord

3
Điều này KHÔNG đúng trong mọi trường hợp. Xem blog này .
Ghopper 21
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.