【问题标题】:Why does Git execute hooks from an other repository?为什么 Git 从其他存储库执行钩子?
【发布时间】:2021-04-26 20:29:45
【问题描述】:

使用此 MWE,Git 在错误的存储库 (A) 中执行挂钩:

# Make simple repo
git init "/tmp/A" && cd "/tmp/A" || exit 1

# Make hook to demonstrate the problem
mkdir -p ".git/hooks" &&
    echo "echo 'EXECUTED!!!'" >.git/hooks/reference-transaction &&
    chmod +x ".git/hooks/reference-transaction" &&
    git clone -c core.hooksPath=".git/hooks" --template= "https://github.com/gabyx/Githooks.git" /tmp/Githooks

结果

Initialized empty Git repository in /home/test/tmp/A/.git/
Cloning into 'Githooks'...
EXECUTED!!!
EXECUTED!!!
EXECUTED!!!
EXECUTED!!!

这很奇怪:我希望 git clone 执行 /tmp/Githooks/.git/hooks 中的钩子,因为来自

core.hooksPath

路径可以是绝对的或相对的。相对路径被视为相对于运行钩子的目录(参见 githooks[5] 的“描述”部分)。

还有Doc

在 Git 调用钩子之前,它会将其工作目录更改为裸存储库中的 $GIT_DIR 或非裸存储库中工作树的根目录。

这是为什么,这是一个应该报告的错误吗?

【问题讨论】:

  • 您将此命令的“挂钩路径”覆盖到您创建的目录。对?你告诉它不要使用正常位置。
  • 是的,我就是这么做的。此外,这种覆盖在几乎所有用例中都不常见(在我的情况下不是),它会导致一些错误的行为 IMO
  • 那有什么问题呢?它完全按照您的指示去做。为什么你认为这是一个错误?
  • 我为什么使用这个:我想克隆一个 repo 并且 core.hooksPath 可能是全局设置的,我不能使用,我也不想填充模板 --template= . core.hooksPath=.git/hooks 确保 GIT LFS 安装它的钩子,这就是我使用它的原因。
  • 嗯.. 不完全是:当我将git clone 更改为cd "$(pwd)/.." && git clone ... 时,它将执行/tmp/Githooks/.git/hooks 中的钩子......

标签: git githooks


【解决方案1】:

我认为这是一个错误。

git clone 命令是一种特殊情况,因为它创建了一个新的 Git 存储库。后续操作应该发生在 这个新的存储库中。相对路径应该是相对于新存储库的。但是,除非模板提供钩子,否则那里不应该有钩子。

(我不清楚模板可以是 Git 存储库:模板应该是本地文件树。)

作为一般规则,运行任何没有机会首先验证的钩子是不明智的。

这是会产生参数的情况之一。

【讨论】:

  • 还有 GIT LFS 吗?我不确定,它也会产生钩子。可能是由过滤器触发的?
  • Git-LFS 使用干净和涂抹过滤器而不是钩子(好吧,也许除了钩子,我从来没有深入研究过细节)。
  • 没错,但它也使用钩子来解决文件锁和其他问题。
猜你喜欢
  • 2020-09-21
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2017-10-03
  • 2010-10-02
相关资源
最近更新 更多