2012-01-27 29 views
6

Đây là của tôi kịch bản pre-cam kết:Làm thế nào tôi có thể chạy một kịch bản virtualenv python như một git pre-cam kết nối

#!/bin/bash 
for f in .git/hooks/pre-commit.d/*; do 
    if [ -x "$f" ]; then 
     if ! "$f"; then 
      echo "DID NOT COMMIT YOUR CHANGES!"; 
      exit 1 
     fi 
    fi 
done 

Một trong những thực thi trong pre-commit.d được một kịch bản python (trước commit-pylint.py) bắt đầu bằng:

#!/usr/bin/env python 
import pylint 

pylint được cài đặt trên virtualenv của tôi. Vấn đề của tôi là git chạy pre-commit prepending /usr/libexec/git-core:/usr/bin đến $PATH, vì vậy ngay cả khi virtualenv của tôi được kích hoạt, tập lệnh pre-commit.d/pre-commit-pylint.py chạy với hệ thống /usr/bin/python (thay vì chạy bằng virtualenv python).

Tôi muốn có các móc tương thích với các nhà phát triển không sử dụng virtualenv. Có cách nào để chạy kịch bản python của tôi với virtualenv minh bạch (tức là, ở lại tương thích với các nhà phát triển đang sử dụng python hệ thống của họ)?

+0

bạn có bao giờ tìm cách ngăn Git khỏi việc thêm tiền tố '/ usr/bin' vào $ PATH của móc không? Chỉ cần bắt gặp điều này bản thân mình. – joemaller

+0

không, tôi đã không. Tôi đã giải quyết vấn đề của mình với câu trả lời của Rob. –

+0

tương tự cho rbenv của Ruby: https://github.com/sstephenson/rbenv/issues/374 –

Trả lời

2

Bạn có thể kiểm tra trong cam kết trước kịch bản của bạn cho $ VIRTUAL_ENV biến và thêm vào trước nó đến $ PATH cho phù hợp:

#!/bin/bash 

if [ -n $VIRTUAL_ENV ]; then 
    PATH=$VIRTUAL_ENV/bin:$PATH 
fi 

for f in .git/hooks/pre-commit.d/*; do 
    if [ -x "$f" ]; then 
     if ! "$f"; then 
      echo "DID NOT COMMIT YOUR CHANGES!"; 
      exit 1 
     fi 
    fi 
done 
0

gì tôi đã kết thúc làm là: cơ cấu .git file:

  • .git/hooks/pre-commit
  • .git/hooks/pre-commit-main.py

.git/móc/pre-cam kết:

#!/usr/bin/env bash 
export PATH="$THE_GOOD_PATH" 
python "$GIT_DIR/hooks/pre-commit-main.py" 

.git/móc/pre-commit-main.py:

#!/usr/bin/env python 
import sys 
print sys.version_info 

Sau đó, khi bạn gọi git commit, hãy chắc chắn rằng THE_GOOD_PATH, là định nghĩa:

export THE_GOOD_PATH="$PATH" 
git commit 

bạn cũng có thể xuất khẩu THE_GOOD_PATH="$PATH" từ .profile hoặc mục cấp đầu của ứng dụng và liên kết tượng trưng của tất cả các lưỡi câu của bạn vào một tập tin duy nhất.

Phương pháp này có lợi thế là virtualnv thuyết bất khả tri: nó cũng hoạt động với Ruby RVM rbenv.

Tôi đã viết thư cho các nhà phát triển Git tại: http://permalink.gmane.org/gmane.comp.version-control.git/258454 yêu cầu họ rời khỏi số PATH một mình, nhưng câu trả lời ban đầu là WONTFIX.

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