2011-04-17 26 views
33

Tôi đang gặp sự cố khi nhận móc sau khi nhận và sau cam kết hoạt động chính xác với msysgit (Windows 7 Pro/32 và Ultimate/64). Đối với hook hậu cam kết, tôi nhận được lỗi trên nếu tôi cam kết từ git-bash hoặc console, nhưng nó hoạt động tốt nếu tôi cam kết thông qua git-gui. Đối với móc hậu móc, cả ba đều cho cùng một lỗi.lỗi msysgit với móc: "lỗi git: không thể sinh ra .git/hooks/post-commit: Không có tệp hoặc thư mục như vậy"

Tôi nghĩ đây là một số loại quyền hoặc lỗi đường dẫn, nhưng không thực sự có bất kỳ đầu mối nào để bắt đầu tại đây.

Trả lời

62

Thêm công việc vào dòng đầu tiên của móc, như vậy:

#!/bin/sh 
echo "executing post-commit" 
exit 0 

này đã cho tôi bối rối trong một thời gian và tôi cũng thấy rằng việc thêm các công việc cố định nó. Trong thế giới SVN, trong khi trong * nix chúng ta có một kịch bản "pre-commit" và trong Windows chúng ta đã có "pre-commit.bat" và SVN tự động nhặt tập tin dơi trong Windows. Git dường như không nhặt tiền tố commit.bat (hoặc bất kỳ móc nào) và thêm shebang vào tệp móc làm việc.

+1

Và theo đó, anh ấy có nghĩa là dòng đầu tiên. Tôi vô tình có một dòng mới trống ở đầu và đã nhận được lỗi tương tự. – jeef3

+0

Chỉ cần FYI - tập tin móc cũng phải được mã hóa ASCII, tôi đã có một công cụ tạo ra một tập tin hook định dạng unicode, mà đã nhận được tôi cùng một lỗi kể từ khi tôi đã có một số byte định dạng trước khi bang. – mamidon

+0

Cũng FYI: Trên hệ thống của tôi, tôi đã có một cái móc với một shebang perl. Nhưng perl.exe không nằm trong đường dẫn. Sau khi thêm nó vào biến env, lỗi đã biến mất. – Fildor

3

Nếu bạn có SHEBANG và nó vẫn không thành công, hãy đảm bảo bạn có <path_to_git> \ bin được đặt trong biến môi trường đường dẫn của bạn.

Có thể bạn cũng sẽ có <path_to_git> \ cmd nếu bạn đã cài đặt nó để hoạt động từ dòng lệnh.

2

Đây là một câu hỏi cũ, nhưng tôi đã chiến đấu với vấn đề chính xác này và câu hỏi SO này xuất hiện, vì vậy tôi nghĩ rằng nó đáng để ghi lại những gì làm việc cho tôi.

Tóm lại: Tôi cần chạy Apache làm người dùng thông thường thay vì Local System. Đây là một thử nghiệm kế thừa VM Tôi đã chơi với, vì vậy nó chỉ chạy Windows XP, nhưng dường như ít nhất trên nền tảng đó (và có thể là những người khác), msysgit không hoạt động đúng khi chạy dưới tài khoản Local System (có lẽ là root filesystem không được ánh xạ chính xác). Kết quả là, không có dòng shebang nào hoạt động như git-http-backend đơn giản là không thể thực thi bất kỳ tập tin nhị phân msysgit nào (ngay cả với đường dẫn tuyệt đối Windows).

Chuyển Apache để chạy dưới dạng tài khoản người dùng thông thường đã khắc phục sự cố này hoàn toàn. Rõ ràng bạn cần đảm bảo rằng người dùng Apache đang chạy như có quyền đối với read/write kho lưu trữ git, nhưng ngoài ra, chỉ cần đảm bảo đường dây shebang của bạn là #!/bin/sh và mọi thứ sẽ được copacetic.

Cuối cùng, vâng, đây là một cái búa lớn. Lý tưởng nhất là bạn có thể sử dụng một cái gì đó như suexec trên Windows, nhưng nhanh chóng googling không chỉ ra một con đường rõ ràng về phía trước, ở đó. Tất nhiên, nếu bất cứ ai có bất kỳ ý tưởng, tôi muốn được quan tâm.

Hiện tại, tính năng này có hiệu quả đối với tôi, nhưng nó không có vẻ lý tưởng.

+0

Tôi tin rằng vấn đề thực sự là có \ bin trong đường dẫn của bạn. Tôi đã sử dụng tài khoản người dùng thông thường và gặp lỗi tương tự. Khi tôi có thùng trong đường dẫn, tôi có thể chạy như tài khoản người dùng thông thường hoặc Hệ thống cục bộ mà không gặp bất kỳ sự cố nào. Trong trường hợp của bạn, bạn có thể đã đặt đường dẫn trong tài khoản người dùng thông thường của mình. –

+0

Tôi tò mò về nơi Apache phù hợp với tất cả những điều này. Nó không phải là một phần của công việc của tôi, nhưng khác với tất cả các triệu chứng phù hợp. Git có trong môi trường toàn cục của tôi PATH ('C: \ Program Files (x86) \ Git \ bin' và' .. \ cmd'). Tôi có hiểu nhầm điều gì đó không? – Barney

2

Nếu một ai đó, như tôi chạy vào một vấn đề tương tự với truy cập vào kho git qua apache, bạn nên thiết lập PATH trong config Apache, như:

SetEnv PATH "c:/Program Files (x86)/Git/bin;" 
+0

Cảm ơn @Xmister. Chúng tôi đã thêm điều này vào httpd.conf và điều này dường như giải quyết được vấn đề. – tjg184

4

Tôi đang sử dụng SourceTree và git LFS và đã có một vấn đề tương tự: cannot spawn .git/hooks/pre-push.

Khắc phục là xóa tệp pre-push (mở nó cho thấy nó bị hỏng) và khởi động lại SourceTree tại thời điểm nó tạo lại tệp pre-push và mọi thứ trở lại bình thường.

Các vấn đề liên quan