我正试图将裸git存储库中的代码部署到只读装载的网络装载上。我遇到的第一个问题是在结账时,git无法创建index.lock文件。通过使用GIT_INDEX_FILE环境变量来指定新位置(临时索引文件),克服了这一问题。现在看来,在结账结束时,git试图创建HEAD.lock.
以下是我尝试运行的要点:
git --work-tree=<deploy-location> --git-dir=/nfs/<bare-git-repo> checkout <ref> -f
如果git-reo在只读文件系统中,有什么方法可以做到这一点吗?
您想要克隆存储库。我认为它不需要写访问权限,因为git可以通过HTTP克隆存储库。如果有人能够通过HTTP向文件系统进行写入,那么我们都会遇到大麻烦。
设置一个小型web服务器,从只读文件系统为文件系统空间提供服务,并告诉git克隆指向只读目录的URL。
您可以使用git archive
来执行此操作,但与git checkout
不同,您需要从一个空的目的地开始。
git --git-dir=/nfs/<bare-git-repo> archive <ref> | (cd <deploy-location> && tar xf -)
对于重复部署,您可能需要创建一个新目录,部署到该目录,然后将符号链接切换到新位置,如下所示:
#!/bin/bash
export GIT_DIR=/nfs/<bare-git-repo>
DEPLOY_TO=<deploy-location>
DEPLOY_DIR="${DEPLOY_TO}-$(date +%Y%m%d.%s)"
echo "Deploying to $DEPLOY_DIR from $GIT_DIR"
mkdir "${DEPLOY_DIR}" &&
git archive "${1:-master}" | (cd "${DEPLOY_DIR}" && tar xf -) &&
ln -snf "${DEPLOY_DIR}" "${DEPLOY_TO}"
如果DEPLOY_TO
设置为/tmp/deploy
,这将创建类似/tmp/deploy-YYYYMMDD.*/
的路径,并将符号链接/tmp/deploy
设置为指向最后创建的路径。