是否可以从只读文件系统上的存储库运行git checkout?

时间:2015-03-27 22:04:13

标签: git readonly

我正在尝试从网络挂载上的裸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在只读文件系统中,有没有办法做到这一点?

2 个答案:

答案 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设置为指向最后创建的路径。