我正在尝试使用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]
如何在子项目中导出/签出给定的一组指定文件和文件夹,以便同时复制所有子文件夹及其嵌套文件夹?
答案 0 :(得分:1)
要让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 索引。