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



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

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

  • 根据HEAD修订版验证工作树;
  • 索引与 HEAD 的提交前验证

第一个用例非常简单,因为将基线(即 HEAD(放入临时文件夹并不是什么大问题。

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

  1. 创建存储

  2. 立即重新涂抹

  3. 使用git-archive通过存储引用创建 zip

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

  5. 放下藏匿处

有没有不那么冗长的方法?

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

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

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方法只是从目标工作树中省略未合并的文件。

有没有不那么冗长的方法呢?

有更好的:

git worktree

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

这里也有类似的问题。这应该符合您的需求。

最新更新