对于“不在缓存中”文件夹,Git签出索引失败

我正在尝试使用git checkout-index将文件从存储库“导出”到具有https://stackoverflow.com/a/160719/1068167中描述的源代码的另一个目录

我的git存储库具有以下结构:

./src/subproject/[files]
./src/subproject/subfolder1/[files]
./src/subproject/subfolder2/[files]
./src/subproject2/[files]

我使用-a标志的第一个“导出”效果很好。我的所有文件和文件夹均已按预期“导出”到/tmp/export/src/...。这是我使用的命令:

git checkout-index -a -f --prefix=/tmp/export/src/

现在,我尝试使用自上次导出以来已更改的文件子集更新导出位置。我不想导出所有文件,因为我已从其他子文件夹中删除了许多不应复制的文件。

我在想这样的事情:

git checkout-index -f --prefix=/tmp/export/src/ -- ./src/subproject/*

此命令将文件复制到“子项目”文件夹中,但失败,并显示一条消息,提示子文件夹。

  

git checkout-index:src / subproject / subfolder1不在缓存中

     

git checkout-index:src / subproject / subfolder2不在缓存中

我希望可以复制以下文件和目录

/tmp/export/src/subproject/[files]
/tmp/export/src/subproject/subfolder1/[files]
/tmp/export/src/subproject/subfolder2/[files]

如何在子项目中导出/签出给定的一组指定文件文件夹,以便同时复制所有子文件夹及其嵌套文件夹?

etreg 回答:对于“不在缓存中”文件夹,Git签出索引失败

要让git checkout-index使用--prefix=<string>将文件从索引复制到其他位置,文件必须在索引中。你不是。

要将特定的Git树对象读入索引,请使用git read-tree。请注意,默认情况下,这会清除当前索引。您可能希望使用临时索引。为此,请通过环境变量名称GIT_INDEX_FILE导出安全但当前不存在的文件的名称。设置变量后,Git将创建该文件并将其用作索引。在删除要清理的临时文件之前,之中或之后取消设置(或使用退出脚本)。

  

我不想导出所有文件,因为我已经从其他子文件夹中删除了许多不应复制的文件。

我怀疑您会以错误的方式处理所有问题:

  • git checkout-index只能复制索引中 的文件。

  • 通常,您通过读取整个提交来填充。也就是说,尽管git read-tree从技术上读取任何树对象,但是如果您将git read-tree指向 commit 对象,它将读取该提交的树。

  • 如果您删除了一堆文件并提交,则新提交是没有(也从未拥有)已删除文件的提交。因此,读取将提交到索引,然后检出索引,不会将这些文件从--prefix 写入到目标目录。

  • 但是像这样使用git checkout-index也不会从目标目录中删除文件。如果这些文件已存在于目标中,并且您不希望它们存在于目标中,则必须自己删除它们。

因此,通常,要像这样使用git checkout-index来导出提交,首先需要从提交中填充索引 ,然后导出到将创建为空目录的位置({ --prefix=/tmp/emptied/之后的{1}}。为此使用rm -rf /tmp/emptied要容易得多。这样也避免了需要带有临时索引的花式步法,从而避免在正在处理诸如某些工作树之类的工作时破坏 the 索引。

本文链接:https://www.f2er.com/3168245.html

大家都在问