如何从git存储库只签出一个文件('稀疏签出')?
如何从git仓库签出一个文件?
正如其他答案中提到的那样:
-
你可以使用git归档(参见Jared Forsyth的回答和Robert Knight的回答 ),因为git1.7.9.5(2012年3月) :
git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x
这将从当前目录的远程仓库的
HEAD
中保存一个'filename
'的副本。
:path/to/directory
部分是可选的。 如果排除,取出的文件将被保存到<current working dir>/path/to/directory/filename
。
Fizer Khan 提到下面明确指定了tar格式:
git archive --format=tar --remote=origin HEAD -- <file> | tar xf -
这与Paul Brannan的回答相似:
git archive --format=tar --remote=origin HEAD:path/to/directory -- filename | tar -O -xf -
正如Doron Gold git archive --remote=xxx
工作,你必须首先在你的git服务器的仓库目录(git守护进程运行的地方)运行这个目录:
git config daemon.uploadarch true
请参阅2009年JakubNarębski在“ git:从存储库中检索单个文件 ”的答案中的patthoyts的评论。
-
或者你必须首先克隆回购,这意味着你得到完整的历史:
- 在.git回购
- 在工作树上。
-
但是,你可以做一个稀疏的结帐 (如果你使用的是Git1.7 +),
- 启用稀疏结帐选项(
git config core.sparsecheckout true
) - 添加你想要在
.git/info/sparse-checkout
文件中看到的内容 - 重新阅读工作树,只显示你所需要的
- 启用稀疏结帐选项(
重新读取工作树:
$ git read-tree -m -u HEAD
这样,你最终会得到一个工作树,包括你想要的东西(即使它只有一个文件)
首先用-n选项克隆repo,这个选项禁止所有文件的默认签出,而–depth 1选项,这意味着它只获得每个文件的最新版本
git clone -n git://path/to/the_repo.git --depth 1
然后检查你想要的文件就这样:
cd the_repo git checkout HEAD name_of_file
如果你已经拥有了一个git repo的副本,你可以使用git log
来检查一个文件的版本来找出hash-id(例如3cdc61015724f9965575ba954c8cd4232c8b42e4),然后你只需input:
git checkout hash-id path-to-file
这是一个实际的例子:
git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /var/www/css/page.css
git checkout branch_or_version – path/文件
例如: git checkout HEAD -- main.c
通常情况下,不可能像下载第一个答案中build议的那样从git下载一个文件而不下载整个存储库。 这是因为Git并不像您想象的那样存储文件(如CVS / SVN),而是基于项目的整个历史logging生成它们。
但是对于特定情况还有一些解决方法。 见下文:
GitHub上
如果这个文件在github.com上,试试例如:
wget https://raw.githubusercontent.com/user/project/master/README
的GitWeb
如果你在服务器上使用Git – GitWeb ,那么你可以尝试一下例子(把它改成正确的path):
wget "http://example.com/gitweb/?p=example;a=blob_plain;f=README.txt;hb=HEAD"
GitWeb在drupalcode.org
例:
wget "http://drupalcode.org/project/ads.git/blob_plain/refs/heads/master:/README.md"
googlesource.com
有一个未公开的function,允许您下载base64编码的原始文件版本:
curl "https://chromium.googlesource.com/chromium/src/net/+/master/http/transport_security_state_static.json?format=TEXT" | base64 --decode
在其他情况下,检查您的Git存储库是否使用任何Web界面。
如果没有使用任何Web界面,你可以考虑把你的代码推到外部服务,如GitHub , Bitbucket 等 。 并用它作为镜子。
如果你没有安装wget
,可以尝试curl -O (url)
。
在GIT 1.7.2.2中工作
例如,你有一个远程some_remote分支branch1 , branch32
所以要签出一个特定的文件,你可以调用这个命令:
git checkout remote/branch path/to/file
作为一个例子,它会是这样的
git checkout some_remote/branch32 conf/en/myscript.conf git checkout some_remote/branch1 conf/fr/load.wav
这个checkout命令会将整个文件结构conf / en和conf / fr复制到你调用这些命令的当前目录中(当然我假设你在之前的某个时刻运行了git init)
最小指南
git checkout -- <filename>
参考: https : //git-scm.com/docs/git-checkout
复制 : 撤消在Git中的一个文件的工作副本修改?
现在我们可以! 因为这是谷歌的第一个结果,我想我会更新到最新的地位。 随着git 1.7.9.5的出现,我们有了git archive
命令,可以让你从远程主机上检索单个文件。
git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x
很简单:
git checkout from-branch-name -- path/to/the/file/you/want
这不会检出from-branch-name
分支。 你将留在你所在的任何分支上,只有那个文件将被从指定的分支中检出。
这是git-checkout
的manpage的相关部分
git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>... When <paths> or --patch are given, git checkout does not switch branches. It updates the named paths in the working tree from the index file or from a named <tree-ish> (most often a commit). In this case, the -b and --track options are meaningless and giving either of them results in an error. The <tree-ish> argument can be used to specify a specific tree-ish (ie commit, tag or tree) to update the index for the given paths before updating the working tree.
帽子给Ariejan德Vroom谁从这篇博客教我这个。
你可以做到
git archive --format=tar --remote=origin HEAD | tar xf - git archive --format=tar --remote=origin HEAD <file> | tar xf -
在git中,在更新它们之前,不要“检出”文件 – 看起来这就是你以后的样子。
像clearcase,csv等许多系统都要求您在“修改”文件之前先“签出”一个文件。 Git不需要这个。 您克隆一个存储库,然后在您的本地存储库副本中进行更改。
一旦你更新文件,你可以做:
git status
查看哪些文件已被修改。 首先添加要提交的index
( index
就像要检查的列表):
git add .
要么
git add blah.c
然后做git status
将显示哪些文件被修改,哪些在index
准备提交或签入。
将文件提交到您的存储库副本中:
git commit -a -m "commit message here"
请参阅git
网站获取手册和指南的链接。
已经给出了两个变体:
git archive --format=tar --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -O -xf -
和:
git archive --format=zip --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | funzip
这些将文件写入标准输出。
这听起来像是你试图从集中版本控制中inheritance一个想法,这本质上并不是 – 它是分布式的。 如果你想使用一个git仓库,你可以克隆它。 然后,您将拥有工作树的所有内容,以及所有历史logging(至less可以引导至当前分支的所有内容),而不仅仅是单个文件或单个提交的快照。
git clone /path/to/repo git clone git://url/of/repo git clone http://url/of/repo
如果您只需要下载该文件,则无需使用Git签出。
GitHub Mate更容易这样做,它是一个Chrome扩展,使您可以单击文件图标来下载它。 也是开源的
说文件名是123.txt,这适用于我:
git结帐 – 他们的123.txt
如果文件位于目录A中,请确保正确指定它:
git Checkout – 他们的“A / 123.txt”
如果您需要从远程Git存储库的特定分支中的特定文件,则该命令是:
git archive --remote=git://git.example.com/project.git refs/heads/mybranch path/to/myfile |tar xf -
其余的可以从@ VonC的答案得出:
如果你需要一个来自主分支的特定文件,它是:
git archive --remote=git://git.example.com/project.git HEAD path/to/myfile |tar xf -
如果你需要一个标签中的特定文件,它是:
git archive --remote=git://git.example.com/project.git mytag path/to/myfile |tar xf -
如果您编辑了本地版本的文件并希望恢复到中央服务器上维护的原始版本,则可以使用Git Extensions轻松实现。
- 最初文件将被标记为提交,因为它已被修改
- select(双击)文件树菜单中的文件
- 列出单个文件的修订树。
- select树的顶部/ HEAD,然后右键单击另存为
- 保存该文件以覆盖文件的修改的本地版本
- 该文件现在有正确的版本,将不再被标记为提交!
简单!