yarn install 在 git post-receive hook 中克隆 github 包失败

yarn install fails on cloning github packages in git post-receive hook

我创建了一个 post-receive 挂钩,用于将更改部署到应用程序并通过 Yarn 安装包。它看起来像这样:

#!/bin/sh

echo "Checking out changes..."
git --work-tree=/home/me/apps/app --git-dir=/home/me/repos/repo.git 
checkout -f

echo "Yarn install..."
cd /home/me/apps/app
yarn install

注释(有用的东西):

第一部分工作正常。钩子肯定是运行。主要应用文件已按预期更新。

在通过 ssh 连接到服务器的同时从命令行执行 yarn install 时,所有软件包都已安装,没有问题。 (ssh 进入服务器的用户与推送提交和 运行 挂钩的用户相同。)

已检查所有目录是否存在权限问题。

问题:

尝试通过 Yarn 安装包时,挂钩 每次 失败。具体来说,它在尝试从 Github 安装软件包依赖项时失败。它 似乎检索了包裹(或者至少它没有告诉我检索它们有任何问题),它只是在尝试将它们移动到 node_modules目录。

我遇到以下两个错误之一:

remote: error Command failed.
remote: Exit code: 128
remote: Command: git
remote: Arguments: pull
remote: Directory: 
/home/me/.cache/yarn/v2/.tmp/45d918f2ecb73f845db6f9b2f91617a3
remote: Output:
remote: fatal: Not a git repository: '.'

或者:

remote: error Command failed.
remote: Exit code: 128
remote: Command: git
remote: Arguments: clone https://github.com/Account/package.git /home/me/.cache/yarn/v2/.tmp/45d918f2ecb73f845db6f9b2f91617a3
remote: Directory: /home/me/apps/app
remote: Output:
remote: fatal: Working tree '/home/me/apps/app' already exists

上面的一些软件包和用户详细信息已进行了一些修改,但是任何 git 相关的软件包安装都会失败,但仅在 post-receive 挂钩中。

在第二个错误中,这很奇怪,因为 git 命令似乎表明它正在尝试将 repo 克隆到缓存中,但随后有一条消息表明它正在尝试将包克隆到主缓存中应用程序目录。

我竟然用钩子把package.json复制到一个新的目录,cd进去,然后试试yarn install。产生了同样的错误。

我完全糊涂了。

我不知道 Git 操作利用了 GIT_DIRGIT_WORK_TREE 环境变量,因此我设置的变量干扰了 Yarn 的 Git操作。

解决办法,取消设置yarn install之前的变量:

#!/bin/sh

export GIT_WORK_TREE=/home/me/apps/app

echo "Checking out changes..."
git --work-tree=$GIT_WORK_TREE --git-dir=/home/me/repos/repo.git 
checkout -f

echo "Yarn install..."
cd $GIT_WORK_TREE
unset GIT_WORK_TREE
yarn install