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

时间:2012-11-28 10:19:47

标签: git sh githooks

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

所以在post-receive中它只是

GIT_WORK_TREE=/home/dev git checkout -f

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

SOURCE_PATH="/home/dev"
GIT_WORK_TREE=$SOURCE_PATH git checkout deploy.sh
$SOURCE_PATH"/deploy.sh"

但它没有给出错误:

error: pathspec 'deploy.sh' did not match any file(s) known to git.

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

3 个答案:

答案 0 :(得分:13)

正如我在“checkout only one file from git”中解释的那样,如果没有先克隆或抓取,您就无法签出一个文件。

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

git-show HEAD:full/repo/path/to/deploy.sh > /another/path./deploy.sh
/another/path./deploy.sh

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


另一种选择是尝试

 GIT_WORK_TREE=$SOURCE_PATH git checkout -- path/to/deploy.sh

直接在工作树中检出该文件。

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

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

答案 1 :(得分:2)

我知道这是ooooooooold,但是我找到了自己的用例,并且在将一些解决方案组合成一个简单的单行程序之前,我找了一段时间来寻找更好的解决方案:

GIT_WORK_TREE=/home/dev git checkout $branch -- deploy.sh

就我而言,我只是想能够偷看"进入我的一些裸存储库而不解包整个事物(其中一些是巨大的)。人们在谈论稀疏检查和其他类似的事情,但我只需要一次性功能。仅查看"文件/健康记录"例如,我会执行以下操作:

GIT_WORK_TREE=/tmp/my-files git checkout master -- "Documents/Health Records"

而且!它出现了。

答案 2 :(得分:1)

这个 git show 或类似的 git cat-file blob 方法对文本文件的工作或多或少都很好,但它们对于二进制文件毫无希望。

更好的方法,可以为任何类型的文件可靠地工作,甚至允许签出整个文件夹:

git archive mybranch folder/file.txt --output result.tar

它创建一个包含所需内容的tar存档,这个文件位于源代码管理中。与二进制文件完美配合。

您唯一需要做的就是提取此tar文件

tar -xf result.tar

有关详细信息,请参阅我的blogpost