如何找到运行git hooks的存储库

时间:2018-06-27 21:52:16

标签: python git

我有两个存储库A和B。

我已经在存储库A中设置了以下git配置:

git config core.hooksPath <path to repository B>

当我在存储库A中执行git命令时,存储库B中的git钩子现在运行。

如何从存储库B中获取到存储库A的路径?这是因为许多其他存储库可以设置此git config,因此存储库B将需要知道为其挂钩运行的存储库。

注意:我的钩子是用python编写的。

2 个答案:

答案 0 :(得分:3)

Git设置环境变量GIT_DIR,以包含从当前工作目录到Git存储库的路径(通常是相对的!)。相对而言,只有在更改目录之前,此路径才是好路径,因此您可能希望将其转换为绝对路径,这取决于要在代码中执行的操作。

Git 使用该环境变量来查找Git存储库目录。如果设置了GIT_WORK_TREE,则将定位工作树,否则,它是当前目录,或者存储库是裸露的。也可以设置其他魔术Git项目,例如GIT_INDEX_FILE。最好不要在不确保每个目录都是绝对路径的情况下更改目录:

for name in ('GIT_INDEX_FILE', 'GIT_OBJECT_DIRECTORY', 'GIT_DIR', 'GIT_WORK_TREE'):
    val = os.environ.get(name, None)
    if val is not None and not os.path.isabs(val):
        os.environ[name] = os.path.abspath(val)
for pathspec in ('GIT_ALTERNATE_OBJECT_DIRECTORIES', 'GIT_CEILING_DIRECTORIES'):
    ...

(根据the documentation,我将后两个代码保留为练习,特别是因为在Windows上用;分隔)。 编辑GIT_CEILING_DIRECTORIES已被记录为绝对值,因此仅GIT_ALTERNATE_OBJECT_DIRECTORIES可能需要调整。请参阅手册页中有关如何处理每个字段的说明。

答案 1 :(得分:2)

https://git-scm.com/docs/githooks

«在Git调用一个钩子之前,它将其工作目录更改为裸存储库中的$ GIT_DIR或非裸存储库中的工作树的根。例外是在推送(预接收,更新,后接收,更新后,推送到签出)期间触发的挂钩,这些挂钩始终在$ GIT_DIR中执行。»

即,您可以检查$GIT_DIR(在Python中为os.environ['GIT_DIR'])或当前目录(在Shell中为pwd,在Python中为os.getcwd())。