我如何从一个git回购签出一个文件?
当前回答
最初,我在2012年git档案中提到(见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回购中 在工作树中。 但是你可以做一个稀疏签出(如果你使用Git1.7+),: 启用稀疏签出选项(git config core.)sparsecheckout真的) 在.git/info/sparse-checkout文件中添加您想要看到的内容 重新读取工作树以只显示您需要的内容
要重新阅读工作树:
$ git read-tree -m -u HEAD
这样,您就得到了一个工作树,其中精确地包含了您想要的内容(即使它只有一个文件)。
Richard Gomes指出(在评论中)“如何从git存储库中克隆、获取或稀疏签出单个目录或目录列表?”
避免下载历史记录的bash函数,它检索单个分支并检索所需的文件或目录列表。
在Git 2.40 (Q1 2023)中,通过检查稀疏模式来判断我们是否使用了“锥”模式的逻辑已经收紧,以避免将单个文件命名为指定锥的模式。
参见William Sprent (williams-unity)提交的5842710(2023年1月03日)。 (由Junio C Hamano—gitster—在commit ab85a7d中合并,2023年1月16日)
目录:检查单文件圆锥模式 署名:威廉·斯普伦特 致谢:维多利亚·戴伊
The sparse checkout documentation states that the cone mode pattern set is limited to patterns that either recursively include directories or patterns that match all files in a directory. In the sparse checkout file, the former manifest in the form: /A/B/C/ while the latter become a pair of patterns either in the form: /A/B/ !/A/B/*/ or in the special case of matching the toplevel files: /* !/*/ The 'add_pattern_to_hashsets()' function contains checks which serve to disable cone-mode when non-cone patterns are encountered. However, these do not catch when the pattern list attempts to match a single file or directory, e.g. a pattern in the form: /A/B/C This causes sparse-checkout to exhibit unexpected behaviour when such a pattern is in the sparse-checkout file and cone mode is enabled. Concretely, with the pattern like the above, sparse-checkout, in non-cone mode, will only include the directory or file located at '/A/B/C'. However, with cone mode enabled, sparse-checkout will instead just manifest the toplevel files but not any file located at '/A/B/C'. Relatedly, issues occur when supplying the same kind of filter when partial cloning with '--filter=sparse:oid=<oid>'. 'upload-pack' will correctly just include the objects that match the non-cone pattern matching. Which means that checking out the newly cloned repo with the same filter, but with cone mode enabled, fails due to missing objects. To fix these issues, add a cone mode pattern check that asserts that every pattern is either a directory match or the pattern '/*'. Add a test to verify the new pattern check and modify another to reflect that non-directory patterns are caught earlier.
其他回答
Git checkout branch_or_version——path/file
示例:git checkout HEAD——main.c
你可以通过
git archive --format=tar --remote=origin HEAD | tar xf -
git archive --format=tar --remote=origin HEAD <file> | tar xf -
如果你已经有了一个git回购的副本,你可以使用git日志签出一个文件的版本来找出哈希id(例如3cdc61015724f9965575ba954c8cd4232c8b42e4),然后你只需输入:
git checkout hash-id path-to-file
下面是一个实际的例子:
git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /var/www/css/page.css
说文件名是123.txt,这对我来说是有效的:
git checkout --theirs 123.txt
如果文件在目录a中,请确保正确地指定它:
git checkout --theirs "A/123.txt"
如果您只需要下载文件,则不需要使用Git签出。
GitHub Mate更容易做到这一点,它是一个Chrome扩展,让你点击文件图标下载它。也是开源的
推荐文章
- 当git说它正在“解析delta”时,它实际上在做什么?
- Git命令将一个文件夹移动到另一个文件夹
- 在单个文件中重新启动/撤消冲突解决方案
- Visual Studio代码如何解决合并冲突与git?
- 无法推送到远程分支,无法解析到分支
- Git:如何将数据库重置为特定的提交?
- 如何在合并期间使用Git和命令行保存本地文件或远程文件?
- 能够用一个命令推到所有git遥控器?
- 重新基于Git合并提交
- 从包含文件名的路径获取不包含文件名的完整路径
- 忽略已经签入目录的内容?
- 如何从windows cmd保存git提交消息?
- (Mac) -bash: __git_ps1:命令未找到
- 如何删除多个已删除的文件在Git仓库
- 使用vimdiff查看所有' git diff '