如何运行virtualenv python脚本作为git pre-commit钩子

时间:2012-01-27 17:13:00

标签: git virtualenv

这是我的预提交脚本:

#!/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 pre /usr/libexec/git-core:/usr/bin$PATH,所以即使我的virtualenv被激活,pre-commit.d/pre-commit-pylint.py脚本也会运行系统/usr/bin/python(而不是运行virtualenv python)。

我想拥有与不使用virtualenv的开发人员兼容的钩子。有没有办法透明地运行我的python脚本与virtualenv(即,与使用他们的系统python的开发人员保持兼容)?

2 个答案:

答案 0 :(得分:4)

您可以检查$ 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

答案 1 :(得分:0)

我最终做的是:.git文件结构:

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

的.git /钩/预提交:

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

的.git /钩/ 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无关的优点:它也适用于Ruby RVM rbenv。

我写信给Git开发人员:http://permalink.gmane.org/gmane.comp.version-control.git/258454要求他们单独离开PATH,但最初的回复是WONTFIX。