git - 从特定提交中检出特定文件会给出“错误:pathspec 文件名不匹配”
问题描述
我在 Windows 上使用 git。
假设我想签出,而不是提交 fe4fd(缩写为使示例更短),而是专门从提交 fe4fd 提交 foo.html。
根据文档,我应该可以使用
git checkout fe4fd foo.html
那应该可行。或者可能
git checkout fe4fd -- foo.html
因为破折号似乎是可选的。
反正。我在正确的目录中。
如果我做一个git status foo.html
或git reflog foo.html
等等,一切看起来都很正常,它知道文件在那里。
一切看起来都很正常
我可以做这个:
git checkout fe4fd
它工作正常
我可以做这个:
git checkout foo.html
但我做不到
git checkout fe4fd foo.html
因为每次我得到
错误:pathspec 'foo.html' 与 git 已知的任何文件都不匹配。
我试过了
C:/whatever
从下到下的完整路径foo.html
- 本地路径如
./foo.html
- 包括封闭的文件夹,比如
../myrepo/foo.html
- 用单引号和双引号括起来
我错过了什么?
TIA。
更新:https ://stackoverflow.com/users/6330106/elpiekay让我得到了答案。ElpieKay 如果您将您的评论作为答案发表,我会将其标记为正确。
答案是,在那个提交的时候,文件不在那个路径上,因为在那个提交之后父文件夹被重命名了。
我通过阅读文档并了解到除非您包含该标志git log
,否则它不会通过路径更改遵循文件的历史记录。--follow
我按照 ElpieKay 的建议做了,该文件显然不是提交的一部分。这是错误的,因为我知道它是。但是我试图签出的文件是,比如说bar/foo.html
,在我正在寻找的结账时该路径不存在。在结帐时,它是在baz/foo.html
。
为了证明这一点,我创建了一个新baz/
文件夹,cd
'd 到它,并从提交中签出文件。这行得通。
解决方案
当您运行git checkout [commit] -- [paths]
时,路径必须存在于该提交中(更准确地说:在提交引用的树中)。如果此后该文件已被重命名,则您必须在那时找到该文件的位置并使用该位置。
更新文件的工作树版本的另一种可能性是使用git show
:
git show commit:old/path/to/file.ext > new/path/to/file.ext
commit:./path/to/file
如果您需要相对于当前目录的路径,则可以使用。否则,路径将锚定到您的存储库根目录。
推荐阅读
- javascript - 如何防止 Firefox DevTools 显示“未找到源映射”错误?
- spring - Spring Boot 隐藏或加密密码的最佳实践
- css - AngularJS Material Design:活动标签的不同颜色(使用主题颜色)
- spring-integration - Spring Cloud 中的反序列化
- javascript - 我想跟踪对我们在网页上显示的文档所做的更改(查看评论/编辑)。
- android - How to install AVD separately and use it in Android Studio
- python - 如何在 Cython、PyQT GUI 中实现 QThread?
- javascript - 简单的对话框警报不起作用
- vue.js - 指定持续时间后无法自动关闭 Vue-strap
- firebase - Firebase Cloud Function 部署 tslint 错误