将Git索引复制到临时文件夹

时间:2018-09-06 22:51:59

标签: git git-checkout

假设我有一个实用程序some-check {baseline_folder} {working_folder},它对文件集(而不是单个文件)进行一些比较。

我想在两个稍微不同的用例中使用此实用程序:

  • 根据HEAD版本验证工作树;
  • 预提交验证索引与HEAD

第一个用例非常简单,因为将基线(即HEAD)放入临时文件夹并不重要。

真正的问题是如何使索引进入某个文件夹。我看到的唯一方法是:

  1. 创建存储区

  2. 立即将其重新应用

  3. 使用git-archive通过隐藏引用创建一个zip

  4. 将其解压缩到临时文件夹

  5. 放下藏匿物

有没有那么繁琐的方法?

UPD:长话短说:问题在于如何获取具有HEAD + stage但未修改/未跟踪的文件夹。

2 个答案:

答案 0 :(得分:3)

要验证索引中的内容,您可以通过以下方式将其中的所有内容提取到临时工作树中:

tmpdir=$(mktemp -d)                # or your other chosen method
trap "rm -rf $tmpdir" 0 1 2 3 15   # do something different in other languages

GIT_WORK_TREE=$tmpdir git checkout-index --all

请确保临时目录存在且为空(此处为mktemp -d),完成后请进行清理(此处为trap)。

请注意,属性规则将应用于git checkout-index步骤。使用git archive,您可以通过export-ignoreexport-subst获得更多控制权。如果要使用该方法,可以使用git write-tree将当前索引转换为树对象,然后对该树对象使用git archive

还要注意,git write-tree方法使用未合并的索引会引发错误,而git checkout-index方法只是忽略了目标工作树中的未合并文件。

答案 1 :(得分:0)

  

有没有那么繁琐的方法?

更好:

git worktree

这允许您将任何目录转换为git存储库的附件,从而使您可以同时签出两个不同的修订版。您可以根据需要添加任意数量的附件,然后在不再需要时将其丢弃。例如,使用同一个库的两个版本(例如,它的最后一个稳定版本和开发的技巧)是非常有用的。

这里有一个similar question。这应该符合您的需求。