【问题标题】:git checkout-index only for committed filesgit checkout-index 仅用于提交的文件
【发布时间】:2012-07-24 07:22:16
【问题描述】:

我目前正在使用以下方式导出 git 存储库:

git checkout-index -f --prefix=$TARGET_PATH/ $GIT_REPO_PATH/*

实际行为:导出发生在添加到索引中的所有文件上。

期望的行为:导出所有不仅添加,而且还提交的文件。

我尝试使用--stage-option,但已提交和未提交文件的阶段为0(我不得不说,我还没有理解阶段号。

有什么想法吗?

【问题讨论】:

  • 因为它会创建一个存档(显然是 ;)),而我只需要一个普通的导出。
  • 那么,git archive HEAD | tar x -C"$TARGET_PATH" 有什么问题?
  • 嗯,这会压缩然后解压缩存储库文件。实际上它可以工作,但它需要时间并产生负载。没有通用的方法,怎么做?
  • tar(没有-j-z 选项)不压缩。复制也需要时间,我怀疑使用 tar 时会有明显的开销。
  • 确实如此。但是在两者之间使用 tar 对我来说似乎毫无意义。不过好吧,如果没有直接的办法,我显然不得不应付。我将不得不检查是否有明显的开销。

标签: git


【解决方案1】:

您不能在一个命令中执行此操作,您必须先将提交树中的文件加载到索引中。幸运的是,您不必使用您使用的普通索引:

$ export GIT_INDEX_FILE=.git/tmp-index
$ git read-tree HEAD && git checkout-index --prefix=/path/dir/ -f -a
$ rm "$GIT_INDEX_FILE"

【讨论】:

    【解决方案2】:

    这个问题的一个简单、天真的解决方案是使用git archive。 它将从 git 历史中提取一棵树并将其写入标准输出。 管道通过 tar 允许您将文件写入磁盘上的特定目录。

    # HEAD to use latest committed version
    git archive HEAD | tar x -C"/path/to/dir"
    

    【讨论】:

      【解决方案3】:

      我认为git --work-tree=<path/to/wherever> checkout <HEAD/branch/hash> -- . 可以满足您的需求。它将在(--work-tree 指定的路径)中创建(存在于指定提交中的每个文件)的副本。

      【讨论】:

      • 这个是最好的答案,但是需要自己创建目录,否则报这个错误:fatal: This operation must be run in a work tree
      猜你喜欢
      • 2014-10-20
      • 1970-01-01
      • 2021-03-26
      • 2011-09-01
      • 2021-08-09
      • 2015-09-24
      • 2018-11-18
      • 1970-01-01
      • 2019-06-18
      相关资源
      最近更新 更多