文件夹的Git签出索引失败;“不在缓存中”;

文件夹的Git签出索引失败;“不在缓存中”;,git,Git,我正在尝试使用git checkout index将文件从存储库“导出”到另一个目录,源代码如中所述 我的git存储库具有以下结构: ./src/subproject/[files] ./src/subproject/subfolder1/[files] ./src/subproject/subfolder2/[files] ./src/subproject2/[files] 我第一次“导出”时使用了-a标志,效果非常好。我的所有文件和文件夹都按预期“导出”到/tmp/export/src/…

我正在尝试使用
git checkout index
将文件从存储库“导出”到另一个目录,源代码如中所述

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

./src/subproject/[files]
./src/subproject/subfolder1/[files]
./src/subproject/subfolder2/[files]
./src/subproject2/[files]
我第一次“导出”时使用了
-a
标志,效果非常好。我的所有文件和文件夹都按预期“导出”到
/tmp/export/src/…
。这是我使用的命令:

git签出索引-a-f--prefix=/tmp/export/src/

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

我是这样想的:

git签出索引-f--prefix=/tmp/export/src/--./src/subproject/*

此命令复制“subproject”文件夹中的文件,但失败,并在子文件夹中显示一条消息

git签出索引:src/subject/subfolder1不在缓存中

git签出索引:src/subject/subfolder2不在缓存中

我希望下面的文件和目录会被复制

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

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

对于
git checkout index
要使用
--prefix=
将文件从索引复制到某个备用位置,文件必须位于索引中。你的不是

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

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

我怀疑你的做法是错误的:

  • git签出索引
    只能复制出索引中的文件

  • 通常,通过读取整个提交来填充索引。也就是说,当
    git read tree
    从技术上读取任何树对象时,如果将
    git read tree
    指向提交对象,它将读取该提交的树

  • 如果您删除了一堆文件并提交了,那么新提交就是一个没有(也从来没有)删除文件的提交。因此,将提交读取到索引中,然后签出索引,将不会从
    --prefix
    将这些文件写入目标目录

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


因此,一般来说,要像这样使用
git checkout index
导出提交,首先需要从提交中填充索引,然后导出到将创建为空目录的目录(
--prefix=/tmp/empted/
之后
rm-rf/tmp/empted
)。使用
git归档
实现这一点要容易得多。这也避免了在使用临时索引时需要花哨的步法,以避免在使用它时破坏索引,例如使用工作树执行任何实际工作。

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

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

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

我怀疑你的做法是错误的:

  • git签出索引
    只能复制出索引中的文件

  • 通常,通过读取整个提交来填充索引。也就是说,当
    git read tree
    从技术上读取任何树对象时,如果将
    git read tree
    指向提交对象,它将读取该提交的树

  • 如果您删除了一堆文件并提交了,那么新提交就是一个没有(也从来没有)删除文件的提交。因此,将提交读取到索引中,然后签出索引,将不会从
    --prefix
    将这些文件写入目标目录

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

因此,一般来说,要像这样使用
git checkout index
导出提交,首先需要从提交中填充索引,然后导出到将创建为空目录的目录(
--prefix=/tmp/empted/
之后
rm-rf/tmp/empted
)。使用
git归档
实现这一点要容易得多。这也避免了在使用临时索引时需要花哨的步法,以避免在使用索引时破坏索引,例如执行任何操作