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


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

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


6237
2017-11-28 10:19


起源



答案:


正如我在“从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命令理解它是一个文件,而不是像标签或命名分支这样的另一个参数。

来自 OP AlexKey测试时,它要求工作树至少检查一次(完全)。


13
2017-11-28 10:35



也许这是对的,但有点奇怪。所以在裸存储库中我们实际上可以通过结帐 simulating 附加的工作树,但这将允许我们只检查整个树。对我来说听起来并不是真的 thought through 实现。现在(为了节省时间)我会检查所有树两次,首先是挂钩,然后是部署脚本。同时我会寻找一个合适的解决方案,如果找不到任何东西,那么我唯一要做的就是使用它 trick。 - Alexey Kamenskiy
@AlexKey你刚试过结账吗? deploy.sh 随着 --?我相信这就是你想要做的。 - VonC
没试过那个解决方案。在那种情况下,path / to / deploy.sh究竟是什么?例如,如果在我的仓库中这个脚本是在 ./deploy.sh 命令看起来像 GIT_WORK_TREE=$SOURCE_PATH git checkout -- deploy.sh? - Alexey Kamenskiy
+1谢谢,我不知道 --。这正是我所需要的。 - Alexey Kamenskiy
问题是,在某个提交时,可执行标志可能与先前的提交不同,并且在执行chmod之前我必须知道当前的权限是什么:我最终使用了第一列 git ls-tree -r master。 - AkiRoss


答案:


正如我在“从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命令理解它是一个文件,而不是像标签或命名分支这样的另一个参数。

来自 OP AlexKey测试时,它要求工作树至少检查一次(完全)。


13
2017-11-28 10:35



也许这是对的,但有点奇怪。所以在裸存储库中我们实际上可以通过结帐 simulating 附加的工作树,但这将允许我们只检查整个树。对我来说听起来并不是真的 thought through 实现。现在(为了节省时间)我会检查所有树两次,首先是挂钩,然后是部署脚本。同时我会寻找一个合适的解决方案,如果找不到任何东西,那么我唯一要做的就是使用它 trick。 - Alexey Kamenskiy
@AlexKey你刚试过结账吗? deploy.sh 随着 --?我相信这就是你想要做的。 - VonC
没试过那个解决方案。在那种情况下,path / to / deploy.sh究竟是什么?例如,如果在我的仓库中这个脚本是在 ./deploy.sh 命令看起来像 GIT_WORK_TREE=$SOURCE_PATH git checkout -- deploy.sh? - Alexey Kamenskiy
+1谢谢,我不知道 --。这正是我所需要的。 - Alexey Kamenskiy
问题是,在某个提交时,可执行标志可能与先前的提交不同,并且在执行chmod之前我必须知道当前的权限是什么:我最终使用了第一列 git ls-tree -r master。 - AkiRoss


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

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

在我的情况下,我只是希望能够“窥视”我的一些裸存储库,而无需解开整个事物(其中一些是巨大的)。人们在谈论稀疏检查和其他类似的事情,但我只需要一次性功能。例如,要查看“Documents / Health Records”文件夹,我会执行以下操作:

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

瞧!它确实出现了。


2
2018-03-05 03:48





这个 git show 或类似的 git cat-file blob 对于文本文件来说,这些方法或多或少都可以正常工作,但它们对于二进制文件来说是没有希望

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

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

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

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

tar -xf result.tar

看我的 博文 更多细节


0
2018-02-27 21:48