首页 > 解决方案 > 如何找到运行 git 挂钩的存储库

问题描述

我有两个存储库 A 和 B。

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

git config core.hooksPath <path to repository B>

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

从存储库 B 内部,如何获取存储库 A 的路径?这是因为许多其他存储库可以设置此 git 配置,因此存储库 B 需要知道它为哪个存储库运行其钩子。

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

标签: pythongit

解决方案


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

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

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'):
    ...

;(根据文档,我将后两者的代码留作练习,特别是因为一个在 Windows 上是-delimited 的)。 编辑:GIT_CEILING_DIRECTORIES记录为已经是绝对的,所以GIT_ALTERNATE_OBJECT_DIRECTORIES可能只需要调整。请参阅手册页对如何在此处处理每个字段的描述。


推荐阅读