如何在没有工作副本的情况下从git获取单个文件的副本?我

时间:2014-08-19 14:37:09

标签: git

我有一个脚本,可以从git存储库引导开发环境。该脚本存在于我想要引导的同一个repo中。我想设置一个只做引导程序的别名而不暴露git clone / checkout或repo的详细信息,因为它将被ops人员用来部署(我不希望他们担心这些细节)

如何才能获得此脚本,而无需克隆/结帐/等?即我不想要一个工作副本来获取这个文件。

在我的svn天'svn cat'做了我在这里问的问题。

当我有一个工作副本时,我知道如何使用'git show'来做这样的事情,但我不知道如何将repo URL,分支和可选标签提供给git show。我也看到过git-cat-file的提及,但同样存在问题。我不关心哪个命令,这两个只是我发现的最有前途的命令。我不想要gitweb(如果这在这里有帮助的话)想用git本身做这个。

谢谢!

1 个答案:

答案 0 :(得分:0)

要从存储库中提取文件,您必须具有对存储库的访问权限。它真的很简单:你必须拥有(至少足够的)整个头发的球,以便你可以得到构成一个文件的所有部分。 (特别是,您需要目标文件,如果有的话,或者包含该对象的包文件,可能是对包文件的其他部分进行增量压缩。)您不需要一个工作树,但你需要一个克隆(虽然可能是一个"浅的"一个,取决于你想要回溯到历史,以及可能是远程)。

你可以通过将repo放在幕后的某个地方,或者甚至在另一台机器上并使用一些秘密接口来悄悄地从另一台机器中提取文件并将其带到gitweb所做的事情上来隐藏它。事实:克隆是在Web服务器和"秘密"接口是普通的旧http - 但你必须有权访问repo。在answer Drax linked a comment中,"秘密界面"是任何可用的git传输(git:ssh:等)-i.e。,与用于克隆存储库的内容相同。 git archive命令为您提供了对远程存储库的shell脚本只读访问权限,尽管它的输出格式是tar或zip存档(因此您必须提取所需的文件)。

你问题的古怪部分是这一点:

  

如何才能获得此脚本,而无需克隆/结帐/等?即我不想要一份工作副本来获取这个文件。

由于短语"工作副本"而导致的。 Git使用"工作树"作为一个技术术语,描述它的三部分设置:存储库(或克隆)本身,"索引"或者"暂存区"和"工作树"。不清楚你是否意味着"工作树"当你说"工作副本"。

同样,您需要(访问)存储库:克隆或访问存储库。您需要工作树。要从 repopath 中的存储库中提取路径为 filepath 的文件,请从 rev 指定的修订中提取,使用git --git-dir=repopath show rev:filepath提取文件到标准输出。来自gitrevisions的任何修订说明符都是合适的,因此您可以使用分支或标记名称,或HEAD,或原始提交ID:git --git-dir=/some/path/to/repo.git show deploy:path/to/file.txt。 ( repopath 与存储库相关,可能指的是裸克隆。)

要使用任何git传输来访问远程存储库并提取单个文件,请使用other answer中所示的git archive命令,例如,而不是git show deploy:path/to/file.txt,您可以使用git archive --remote=url deploy:path/to file.txt | tar xf -(将一个文件提取到./file.txt)或git archive --remote=url deploy: path/to/file.txt | tar xf -(将提取相同的文件但提取到./path/to/file.txt)。