git checkout 修订 -- *partial/path*? (即从特定提交使用 pathspec 和 git checkout)

git checkout 修订 -- *partial/path*? (即从特定提交使用 pathspec 和 git checkout)

要从 HEAD 中检出路径+名称中带有“partial/path”的任何文件:

git checkout *partial/path*

从特定提交中检出文件(--这里是可选的):

git checkout abcde -- full/path/to/my/file full/path/to/another/file

与直觉相反,以下命令确实不是签出与指定提交中的 pathspec 匹配的文件:

git checkout abcde -- *partial/path*

相反,它导致error: pathspec '*partial/path*' did not match any file(s) known to git.

我的问题是:是否可以使用 pathspec 从特定提交中检出多个文件?


笔记:我意识到这git checkout branch file可能是一个完全不同的命令git checkout pathspec(也完全不同于git checkout branch),这也许可以解释为什么 pathspec 在这里不起作用。

笔记:以下别名只能部分解决问题:

[alias] ccps = "!f() { git ls-files $2 | xargs -I {} git checkout $1 -- \"{}\"; }; f"

当添加或删除一个或多个与当前提交和目标提交之间的路径规范匹配的文件时,此操作会失败。


更新:以下别名(有点)可以实现我想要的功能:

[alias] ccps = "!f() { git ls-tree -r --name-only $1 | grep $2 | xargs -I {} git checkout $1 -- {}; }; f"

此解决方案的问题:

  • grep $2与 pathspec 不同(不能与...和 一起使用*)。
  • 它相当慢(花了~5 秒钟才连续git checkout返回 57 个文件grep)。

但与此同时,现在我可以使用正则表达式,这是一个优点。

答案1

通配符通常由您的针对实时文件系统。要将它们直接传递给 Git,请转义或引用路径规范,即\*partial/path\*"*partial/path*"。这样,扩展将由 git 本身完成,并针对给定的提交。

相关内容