这是我的预提交脚本:
#!/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的开发人员保持兼容)?
答案 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。