Как я могу запустить скрипт virtualenv python в качестве крючка предварительной фиксации git

это мой сценарий предварительной фиксации:

#!/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

один из исполняемых файлов в pre-commit.d-это скрипт python (pre-commit-pylint.py) это начинается с:

#!/usr/bin/env python
import pylint

pylint установлен на моем virtualenv. Моя проблема в том, что git запускает pre-commit prepending /usr/libexec/git-core:/usr/bin to $PATH, поэтому, даже если мой virtualenv активирован pre-commit.d/pre-commit-pylint.py скрипт работает с системой /usr/bin/python (вместо работы с virtualenv python).

Я хочу иметь крючки, которые совместимость для разработчиков, которые не используют virtualenv. Есть ли способ прозрачно запустить мой скрипт python с virtualenv (т. е. оставаться совместимым с разработчиками, которые используют свой системный python)?

2 ответов


вы можете проверить свой сценарий предварительной фиксации для переменной $VIRTUAL_ENV и добавить его в $PATH соответственно:

#!/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

то, что я закончил, это:.git структура файла:

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

.git / hooks / предварительная фиксация:

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

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

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

тогда, когда вы позвоните git commit убедитесь, что THE_GOOD_PATH, определено:

export THE_GOOD_PATH="$PATH"
git commit

вы также можете экспортировать THE_GOOD_PATH="$PATH" из своего .profile или верхний уровень вашего приложения и символическая ссылка все крючки к одному файл.

этот метод имеет преимущество быть virtualenv agnostic: он также работает с Ruby RVM rbenv.

Я написал разработчикам Git по адресу:http://permalink.gmane.org/gmane.comp.version-control.git/258454 просить их покинуть наши PATH один, но первоначальный ответ был WONTFIX.