【问题标题】:git - checkout single file under bare repositorygit - 在裸存储库下签出单个文件
【发布时间】:2012-11-16 04:00:38
【问题描述】:

在服务器上,我有一个裸存储库,它是开发过程的来源,并简化了对 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.

我做错了什么?还是根本不可能这样做?

【问题讨论】:

    标签: git sh githooks


    【解决方案1】:

    正如我在“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 的测试来看,它要求工作树至少被(完全)检出一次。

    【讨论】:

    • 也许是这样,但有点奇怪。因此,在裸存储库中,我们实际上可以通过 simulating 附加的工作树检出,但这将只允许我们检出整个树。这对我来说听起来不是真正的thought through 实现。现在(为了节省时间)我会检查所有树两次,首先是在钩子中,然后是在部署脚本中。同时我会寻找一个合适的解决方案,如果什么也找不到,那么我唯一要做的就是使用这个trick
    • @AlexKey 您是否尝试使用-- 仅结帐deploy.sh?我相信这就是你想要做的。
    • 没试过那个解决方案。在那种情况下, path/to/deploy.sh 到底是什么?例如,如果在我的 repo 中,此脚本位于 ./deploy.sh,则该命令将类似于 GIT_WORK_TREE=$SOURCE_PATH git checkout -- deploy.sh?
    • +1 谢谢,我不知道--。这正是我所需要的。
    • 问题是在某个提交时,可执行标志可能与之前的提交不同,在执行 chmod 之前,我必须知道当前的权限是什么:我最终使用了@987654340 的第一列@.
    【解决方案2】:

    这种 git show 或类似的 git cat-file blob 方法对于文本文件或多或少可以正常工作,但对于二进制文件则没有希望。

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

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

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

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

    tar -xf result.tar
    

    更多详情请查看我的blogpost

    【讨论】:

      【解决方案3】:

      我知道这是 ooooooooold,但我找到了我自己的这个功能的用例,并在将一些解决方案组合成一个简单的单行代码之前环顾了一段时间以寻找更好的解决方案:

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

      就我而言,我只是希望能够“窥视”我的一些裸存储库,而无需打开整个存储库(其中一些是巨大的)。人们在谈论稀疏结账和其他类似的事情,但我只需要一次性功能。例如,要查看“文档/健康记录”文件夹,我会执行以下操作:

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

      瞧!它确实出现了。

      【讨论】:

      猜你喜欢
      • 2013-02-15
      • 2010-10-02
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 2013-01-29
      • 2011-02-21
      • 2015-07-30
      • 2014-08-03
      相关资源
      最近更新 更多