Git如何根据提交ID获取指定文件夹(不含子文件夹)的指定版本文件
解决方法
要仅获取foo目录(不含子目录foo/bar)下1686e2f版本的所有.txt文件(包括已删除的),可以通过以下两种方式实现:
方法一:使用git checkout并引号包裹路径模式
直接让Git解析通配符而非shell,避免路径展开错误:
git checkout 1686e2f -- 'foo/*.txt'
这里的单引号是核心:它阻止shell将*.txt展开为当前工作区存在的文件,而是让Git在指定提交1686e2f中匹配foo目录下直接存放的所有.txt文件,不会包含子目录foo/bar里的文件。
方法二:使用git restore(Git 2.23及以上版本)
git restore是更现代的文件恢复命令,语义更清晰:
git restore --source=1686e2f --staged --worktree -- 'foo/*.txt'
--source=1686e2f指定从目标提交恢复文件--staged --worktree同时恢复暂存区和工作区的文件- 同样用单引号包裹路径模式,确保Git严格匹配
foo目录下的直接文件
为什么之前的操作出错?
- 第一次执行
git checkout 1686e2f foo/*.txt时,shell会把foo/*.txt展开为当前工作区foo目录下存在的所有.txt文件(包括e43071a才添加的foo/5.txt),但该文件在1686e2f版本中不存在,因此Git报错路径不匹配。 - 删除
foo/*.txt后,shell找不到匹配的文件,便将foo/*.txt作为字面量传给Git,部分场景下可能因shell或Git版本的规则,导致错误地递归匹配了子目录的文件;而用引号包裹后,Git会严格按照foo/*.txt的模式匹配,仅处理foo目录下的直接文件。
内容的提问来源于stack exchange,提问作者user2347638
相关产品推荐
相关产品推荐

