【问题标题】:Checking out a specific file from a specific commit gives "error: pathspec filename did not match"从特定提交中检出特定文件会给出“错误:pathspec 文件名不匹配”
【发布时间】:2019-07-09 04:37:41
【问题描述】:

我在 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 已知的任何文件都不匹配。

我试过了

  • C:/whateverfoo.html 的完整路径
  • 本地路径,如./foo.html
  • 包括封闭文件夹,如../myrepo/foo.html
  • 用单引号和双引号括起来

我错过了什么?

TIA。

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

答案是,在提交时,文件不在那个路径,因为在提交之后父文件夹已被重命名。 p>

我通过阅读 git log 的文档发现了这一点,并了解到除非您包含 --follow 标志,否则它不会通过路径更改来跟踪文件的历史记录。

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

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

【问题讨论】:

  • foo.html 是否存在于fe4fd 中? git ls-tree fe4fd -r -t foo.html 可以打印任何东西吗?如果它什么都不打印,则该文件在fe4fd 的树中不存在。
  • 区分大小写:文件不是存储为“Foo.html”吗?
  • @LeGEC 好主意,但绝对不是案例问题。查看其他有效的命令。
  • @ElpieKay 我想你已经明白了。该特定的提交号没有显示任何内容,尽管该文件肯定在其中。文件夹已重命名,我似乎无法在重命名之前返回。我可以回到重命名,但不能更进一步。

标签: git git-bash git-checkout


【解决方案1】:

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

另一种更新文件工作树版本的方法是使用git show

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2020-02-14
    • 2015-08-03
    • 1970-01-01
    • 2011-08-11
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多