【问题标题】:How do I git extract all files in a sha to `/tmp`?如何 git 将 sha 中的所有文件提取到`/tmp`?
【发布时间】:2020-08-13 17:25:59
【问题描述】:

在寻找将特定提交(由其sha 指定)导出到目录的方法时,我得到了很多指针,每个指针都有很多答案。

可能是因为这样的问题 are under specified, 使多个答案成为可能。

这是我不想想做的:

  • 我不想克隆我的多 GB 存储库然后结帐。我想从当前 repo 结帐到一个目录。
  • 我要提取的sha 既没有tag 也没有branch 标记。其实我想要的sha还是一片朦胧。有几个是候选人。

确实,简单地运行git show a1b2c3c:path/to/file/myfile.c(从特定提交中提取特定文件)已经完成了我想要的,除了:

  • 我想提取一棵完整的树(从根),而不仅仅是一个文件。
  • git show 将文件发送到终端。我想保存到/tmp

然后我的问题是:如何将sha 中的所有文件提取到/tmp

为了提供动力,让我提一下这个问题的几个用例。这些是我的问题;他们不是问题!

  • 我在过去(可能很遥远)做了一个即兴演示,我想确定该项目的重点。
  • 我忽略了将给定文件添加到存储库中,有时需要很长时间才能注意到未添加文件。我想跟踪文件丢失的时间。

【问题讨论】:

  • 您链接到的第一个问题显示如何使用git archive 来做到这一点,这有什么问题?这怎么不符合您的要求?
  • @JoachimSauer 是git archive sha 一个选项,而不仅仅是git archive | <pipe>git archive master?让我确认试验是否无害,然后在我这边试验。
  • @JoachimSauer 感谢您的提示。当然,这一切都很简单,但由于我一直在我的“git 备忘单”中寻找这个 Q&A,我已经写了(至少供我自己参考,如果不是每个人的参考)答案,而不是删除问题。我找不到git archive 确实使存储库不可变的正式确认,但是从新/隔离存储库中的实验来看,.git 目录中的任何内容都没有被修改,所以答案似乎是肯定的。

标签: git


【解决方案1】:

正如Joachim 所建议的,这个answer 几乎可以解决问题。

要添加另一个用例,您可能会扪心自问:我是专门针对这个案例进行测试的;这个测试是如何在那个提交时通过的!?.

在这种情况下,运行起来很方便:

mkdir /tmp/new_dir
git archive a1b2c3 | tar -x -C /tmp/new_dir

并在完全隔离的情况下运行测试。

与几乎可以做到的答案相比,需要注意的几点:

  • 如果您对 bzip/gzip/zip 存档不感兴趣,但是(尽管 archivegit archive 中)更希望在 /tmp 中直接复制目录,则需要为先提取。
  • 如果您想知道<tree-ish> 到底是什么意思,您确实可以将sha 指定为git archive。换句话说,sha 是 tree-ish>。
  • tar 通常对尾随的 / 很挑剔,根据它是否存在产生不同的结果。幸运的是,在这种情况下,是否存在尾部斜杠没有区别。

对于completeness-x 使tar 提取而不是存档,-C 是指定目录所必需的前缀。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2021-09-01
    • 2011-06-02
    相关资源
    最近更新 更多