git - 在裸存储库下检出单个文件

Ale*_*kiy 12 git sh githooks

在服务器上,我有裸存储库,它是开发过程的起源,并简化了到QA环境的部署.

所以post-receive它根本

GIT_WORK_TREE=/home/dev git checkout -f
Run Code Online (Sandbox Code Playgroud)

但随着产品变得越来越复杂,还应该发生其他一些事情.所以现在它由deploy.sh脚本处理,脚本也被存储库跟踪.所以我想做的是能够而不是检查整个存储库只是结账deploy.sh并运行它.我认为这样的东西会起作用:

SOURCE_PATH="/home/dev"
GIT_WORK_TREE=$SOURCE_PATH git checkout deploy.sh
$SOURCE_PATH"/deploy.sh"
Run Code Online (Sandbox Code Playgroud)

但它不起作用给出错误:

error: pathspec 'deploy.sh' did not match any file(s) known to git.
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?或者这样做是不可能的?

Von*_*onC 14

正如我在" 仅从git中检出一个文件 "中所解释的那样,如果没有克隆或首先获取文件,则无法仅签出一个文件.

但是你git show那个文件,这意味着你可以将其内容转储到一个/another/path./deploy.sh文件中,然后执行该文件.

git-show HEAD:full/repo/path/to/deploy.sh > /another/path./deploy.sh
/another/path./deploy.sh
Run Code Online (Sandbox Code Playgroud)

由于您从post-receive挂钩执行该操作,因此git-show将显示该deploy.sh文件的最新版本.


另一种选择是尝试

 GIT_WORK_TREE=$SOURCE_PATH git checkout -- path/to/deploy.sh
Run Code Online (Sandbox Code Playgroud)

并直接在工作树中签出该文件.

' --'帮助git命令理解它是一个文件,而不是像标签或命名分支这样的另一个参数.

OP AlexKey的测试中,它要求工作树已经(完全)检出至少一次.