在裸仓库中检出单个文件

15

我在服务器上有一个裸仓库,它是开发过程的起点,并且可以简化部署到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个回答

16

正如我在"仅从git中检出一个文件"中所解释的那样,您不能在没有克隆或提取的情况下仅检出一个文件。

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

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

因为你是从post-receive钩子中执行的,所以git-show将显示deploy.sh文件的最新版本。


另一种选择是尝试

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

直接在您的工作树中检查该文件。

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

根据发帖者AlexKey的测试,需要至少完全检出一次工作树。


@AlexKey,你尝试使用“--”只检出deploy.sh了吗?我相信这就是你想要做的。 - VonC
没有尝试过那个解决方案。在这种情况下,path/to/deploy.sh确切的位置是什么?例如,如果在我的repo中,此脚本位于./deploy.sh,则命令将类似于GIT_WORK_TREE=$SOURCE_PATH git checkout -- deploy.sh - Alexey Kamenskiy
似乎只有在整个树至少被检出一次后才能正常工作,否则会出现相同的错误。 - Alexey Kamenskiy
@AlexKey 不确定你的意思:使用 git show 的想法是将一个文件的内容(在任何 git 存储库之外)转储出来,然后该文件会执行您所需的所有检出操作。 - VonC
1
问题在于,在某个提交中,可执行标志可能与先前的提交不同,在运行chmod之前,我需要知道当前权限是什么:最终我使用了“git ls-tree -r master”的第一列。 - AkiRoss
显示剩余14条评论

3

我知道这个问题很老了,但我找到了自己的用例,并在寻找更好的解决方案一段时间后,将几个解决方案结合成了一个简单的一行代码:

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

在我的情况下,我只是想要能够“窥视”一些我的裸仓库,而不必解包整个仓库(其中一些非常庞大)。人们在谈论稀疏检查和其他类似的事情,但我只需要一次性的功能。例如,为了只检出“文档/健康记录”文件夹,我会执行以下操作:

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

看哪!它就在那里出现了。


所以对我来说这非常有用,因为我正在尝试在使用了 :repo_tree 的 Capistrano 后部署 monorepo 的一部分。(请参见 https://stackoverflow.com/questions/57360952/linking-to-multiple-subdirectories-using-repo-tree) - jwir3

2

这种像git show或类似的git cat-file blob方法对于文本文件来说基本上还可以,但对于二进制文件来说就无能为力了。

更好的方法可以可靠地处理任何类型的文件,并且甚至允许检出整个文件夹:

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

它创建一个包含所需内容的tar归档文件,就是在源代码控制中包含的文件。即使涉及二进制文件,也可以完美地工作。

你需要做的唯一事情就是解压缩这个tar文件。

tar -xf result.tar

查看我的博客文章获取更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接