You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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目录下的直接文件

为什么之前的操作出错?

  1. 第一次执行git checkout 1686e2f foo/*.txt时,shell会把foo/*.txt展开为当前工作区foo目录下存在的所有.txt文件(包括e43071a才添加的foo/5.txt),但该文件在1686e2f版本中不存在,因此Git报错路径不匹配。
  2. 删除foo/*.txt后,shell找不到匹配的文件,便将foo/*.txt作为字面量传给Git,部分场景下可能因shell或Git版本的规则,导致错误地递归匹配了子目录的文件;而用引号包裹后,Git会严格按照foo/*.txt的模式匹配,仅处理foo目录下的直接文件。

内容的提问来源于stack exchange,提问作者user2347638

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:39:53