首页 > 解决方案 > 从特定提交中检出特定文件会给出“错误:pathspec 文件名不匹配”

问题描述

我在 Windows 上使用 git。

假设我想签出,而不是提交 fe4fd(缩写为使示例更短),而是专门从提交 fe4fd 提交 foo.html。

根据文档,我应该可以使用

git checkout fe4fd foo.html

那应该可行。或者可能

git checkout fe4fd -- foo.html

因为破折号似乎是可选的。

反正。我在正确的目录中。

如果我做一个git status foo.htmlgit reflog foo.html等等,一切看起来都很正常,它知道文件在那里。

一切看起来都很正常

我可以做这个:

git checkout fe4fd

它工作正常

我可以做这个:

git checkout foo.html

但我做不到

git checkout fe4fd foo.html

因为每次我得到

错误:pathspec 'foo.html' 与 git 已知的任何文件都不匹配。

我试过了

我错过了什么?

TIA。

更新https ://stackoverflow.com/users/6330106/elpiekay让我得到了答案。ElpieKay 如果您将您的评论作为答案发表,我会将其标记为正确。

答案是,在那个提交的时候,文件不在那个路径上,因为在那个提交之后父文件夹被重命名了。

我通过阅读文档并了解到除非您包含该标志git log,否则它不会通过路径更改遵循文件的历史记录。--follow

我按照 ElpieKay 的建议做了,该文件显然不是提交的一部分。这是错误的,因为我知道它是。但是我试图签出的文件是,比如说bar/foo.html,在我正在寻找的结账时该路径不存在。在结帐时,它是在baz/foo.html

为了证明这一点,我创建了一个新baz/文件夹,cd'd 到它,并从提交中签出文件。这行得通。

标签: gitgit-bashgit-checkout

解决方案


当您运行git checkout [commit] -- [paths]时,路径必须存在于该提交中(更准确地说:在提交引用的树中)。如果此后该文件已被重命名,则您必须在那时找到该文件的位置并使用该位置。

更新文件的工作树版本的另一种可能性是使用git show

git show commit:old/path/to/file.ext > new/path/to/file.ext

commit:./path/to/file如果您需要相对于当前目录的路径,则可以使用。否则,路径将锚定到您的存储库根目录。


推荐阅读