如何从git仓库中稀疏地仅检出一个文件?
最初,我在2012年提到了git archive
(参见Jared Forsyth的答案和Robert Knight的答案)。自git1.7.9.5 (2012年3月)以来,Paul Brannan的答案。
git archive --format=tar --remote=origin HEAD:path/to/directory -- filename | tar -O -xf -
但是:自2013年以来,这对于远程https://github.com URL已不再可行。
请参见旧页面“我可以存档存储库吗?”
当前(2018年)页面“关于在GitHub上归档内容和数据”推荐使用第三方服务,如GHTorrent或GH Archive。
因此,您也可以处理本地副本/克隆:
如果您有裸仓库的本地副本,您还可以按此答案中提到的以下方法进行操作。
git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file
或者你必须首先克隆存储库,这意味着你可以获得完整的历史记录:
-
.git repo 中
-
工作树中。
-
但是,如果你正在使用 Git1.7+,那么你可以做一个稀疏的checkout:
- 启用稀疏的checkout选项(
git config core.sparsecheckout true
) - 在
.git/info/sparse-checkout
文件中添加想要查看的内容 - 重新读取工作树,只显示你需要的内容
- 启用稀疏的checkout选项(
重新读取工作树:
$ git read-tree -m -u HEAD
这样,你最终会得到一个包含你想要的精确内容的工作树(即使只有一个文件)
Richard Gomes指出 (在评论中) "如何从 Git 存储库克隆、提取或稀疏地检出单个目录或目录列表?"
一个避免下载历史记录、检索单个分支和检索你需要的文件或目录列表的 bash 函数。
使用 Git 2.40(Q1 2023),通过检查稀疏性模式来查看我们是否使用了 "cone" 模式的逻辑已经变得更加严格,避免将指定单个文件的模式误认为是指定 cone。
查看由William Sprent (williams-unity
)于2023年1月3日提交的提交记录 5842710。
(合并自Junio C Hamano -- gitster
--的《2023年1月16日提交的提交记录 ab85a7d)
dir
:检查单文件锥形模式模式签名:William Sprent
确认:Victoria Dye
疏散检出文档指出,锥形模式的模式集仅限于递归包含目录的模式或匹配目录中的所有文件的模式。
在疏散检出文件中,前者以以下形式表示:/A/B/C/
而后者则成为一对模式,形式为:
/A/B/ !/A/B/*/
或在匹配顶层文件的特殊情况下:
/* !/*/
add_pattern_to_hashsets()
函数包含的检查旨在在遇到非锥形模式时禁用锥形模式。
但是,这些检查未能捕捉到模式列表试图匹配单个文件或目录的情况,例如:
一种形式的模式:/A/B/C
这会导致当此类模式位于疏散检出文件中,并启用锥形模式时,出现意外行为。
具体地说,使用上述格式,非锥形模式下的稀疏检出只包括位于“/A/B/C
”位置的目录或文件。
但是,启用锥形模式后,稀疏检出将只展现顶层文件,而不包括位于“/A/B/C
”位置的任何文件。
相关问题出现在使用“--filter=sparse:oid=
”进行部分克隆时提供相同类型的过滤器时。
"upload-pack
"将正确地只包括与非锥形模式匹配的对象。
这意味着使用相同的过滤器但启用锥形模式时检出新克隆的repo会因缺少对象而失败。
为了解决这些问题,添加锥形模式模式检查,确保每个模式都是一个目录匹配或模式为“/*
”。
添加一个测试来验证新模式检查,并修改另一个以反映非目录模式更早被捕获。