我正在尝试从网络挂载上的裸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 repo在只读文件系统中,有没有办法做到这一点?
答案 0 :(得分:1)
您希望克隆存储库。我不认为它需要写访问权限,因为git可以通过HTTP克隆存储库。如果有人能够通过HTTP写入文件系统,我们就会遇到大麻烦。
设置一个小型Web服务器,从只读文件系统提供文件系统空间,并告诉git克隆指向只读目录的URL。
答案 1 :(得分:1)
您可以使用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
设置为指向最后创建的路径。