2012-02-16 39 views
10

Tôi đã tạo một móc nhỏ pre-commit trong python. Hook này hoạt động giống như một nét duyên dáng dưới Linux, nhưng trong Windows nó vẫn không ngừng nói với tôi:git không thể thực thi python-script như móc

error: cannot spawn .git/hooks/pre-commit: No such file or directory 

Tôi biết đã có câu hỏi tương tự ở đây về cùng một vấn đề và vỉa kết luận là công việc. Kịch bản của tôi có này trên dòng đầu tiên:

#!F:\PortableApps\PortablePython3.2\App\python.exe 

Nó cũng thú vị để lưu ý rằng thực hiện kịch bản đơn giản bằng cách viết .git/hooks/pre-commit làm việc tuyệt vời, nhưng ngay sau khi tôi cố gắng cam kết, git spits ra thông điệp trên.

Một điều thú vị là, khi tôi chuyển đổi bảng mã từ ANSI sang UTF-8 (sử dụng Notepad ++), tôi nhận được lỗi sau khi cố gắng thực thi kịch bản:

.git/hooks/pre-commit: Cannot execute binary file 

Tôi đang sử dụng sau công cụ:

+0

có thể trùng lặp của [Làm thế nào tôi có thể nhận được git của tôi (msysgit trên cửa sổ) sau cam kết kịch bản để gọi kịch bản python của tôi như python chứ không phải là bash?] (Http: // stackoverflow.com/questions/1547005/how-can-i-get-my-git-msysgit-on-windows-post-cam-script-to-invoke-my-python) – Amber

+0

@Amber sử dụng bash-script làm trình bao bọc gọi 'python.exe pre-commit.py' hoạt động. Nhưng có một phiên bản chỉ Python? –

Trả lời

10

Tôi đã sử dụng cách tiếp cận proxy để làm cho tập lệnh python hoạt động trong các cửa sổ (với msysgit). Các kịch bản đầy đủ (với mô tả về cách tôi đã làm nó) có thể được tìm thấy ở đây: https://gist.github.com/1839424

Đây là một phần quan trọng về việc làm cho nó hoạt động trong môi trường Windows


Nếu bạn đang làm việc với Windows (và " msysgit "), nó phức tạp hơn một chút. Vì "msysgit" dường như gặp sự cố khi xử lý SHEBANG, bạn sẽ phải sử dụng một mẹo nhỏ để làm cho tập lệnh thực thi (có thể tìm thêm thông tin về vấn đề này here).

Để làm cho tập lệnh hoạt động, bạn sẽ muốn xóa SHEBANG khỏi tập lệnh Python ("pre-commit.py") và sử dụng một bash-script bao bọc để gọi cho trình thông dịch. Tập lệnh này sẽ trông giống như sau:

#!/bin/sh 
python .git/hooks/pre-commit.py 

Lưu trữ tập lệnh này dưới dạng tệp "tiền cam kết" (không có tệp). Điều này giả định rằng bạn có Python trong PATH của bạn. Nếu không, bạn cũng có thể chỉ định đường dẫn đầy đủ đến trình thông dịch thực thi của bạn.

Tập lệnh này sẽ được gọi là "git commit" và gọi lệnh python-script để kiểm tra các tệp lớn. Đường dẫn sau SHEBANG không nên thay đổi, vì "msysgit" sẽ tự động sửa nó. Bạn phải chỉ định một đường dẫn liên quan đến repo-root cho kịch bản lệnh Python được thực hiện (bởi vì nó từ nơi mà kịch bản được gọi).

Sau đó bạn sẽ muốn sao chép cả tệp trình bao bọc ("pre-commit") và Python-script ("pre-commit.py") vào thư mục ".git/hooks" repos của bạn, cá nhân hóa Python-script ("max_file_size" và "git_binary_path") và đánh dấu "pre-commit" -file thực thi.

+3

Nếu bạn muốn truyền các đối số (ví dụ cho móc hậu sau), hãy thêm một '$ *': 'python .git/hooks/pre-commit.py $ *' – Onur

+0

Bản thân tập lệnh Python không cần phải ở trong thư mục .git. Nó có thể ở nơi khác trong kho lưu trữ của bạn nếu bạn thích, để nó được cam kết như một phần của kho lưu trữ. Sau đó, cũng khá đơn giản để tự động cài đặt git hooks vào một bản sao mới của repo bằng cách lập trình tạo các kịch bản shell được mô tả ở đây trong thư mục .git/hooks. – bsa

+0

điều gì sẽ xảy ra nếu nhóm ghi nhớ có hệ điều hành không đồng nhất. Ví dụ, chúng tôi có một kho lưu trữ Android, và các nhà phát triển làm việc trên nó cả trên OS X và Windows. làm thế nào chúng ta có thể đảm bảo rằng móc của chúng tôi hoạt động trên các hệ điều hành khác nhau? –

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