我已经克隆了一个存储库(git clone --bare)并且显然git fetch没有更新它,但git fetch origin master:master确实如此.我不明白这些语法之间的所有细微差别:
git fetchgit fetch origingit fetch origin mastergit fetch origin master:masterorigin是我唯一的远程,master是我唯一的分支,帮助说:
如果未指定远程,则默认情况下将使用原始远程
那么为什么这四条线不一样呢?
编辑:三个第一个命令似乎在一个名为的临时分支中获取FEATCH_HEAD.但由于我使用裸克隆,我无法使用git merge获取结果.
编辑2:从@ torek的回答中,我做了一个小测试并且差异了--bare和--mirror克隆目录.结果如下:
diff -ru mesa.bare.git/config mesa.mirror.git/config
--- mesa.bare.git/config 2014-10-14 20:01:42.812226509 -0400
+++ mesa.mirror.git/config 2014-10-14 20:00:53.994985222 -0400
@@ -4,3 +4,5 @@
bare = true
[remote "origin"]
url = git://anongit.freedesktop.org/mesa/mesa
+ fetch = +refs/*:refs/*
+ mirror = true
Only in mesa.bare.git/objects/pack: pack-17005b7e1020d291eb86d778a174ecf0d60d92a9.idx
Only in mesa.bare.git/objects/pack: pack-17005b7e1020d291eb86d778a174ecf0d60d92a9.pack
Only in mesa.mirror.git/objects/pack: pack-c08b44b7f290ef0bc9abe3a0b974695c85a69342.idx
Only in mesa.mirror.git/objects/pack: pack-c08b44b7f290ef0bc9abe3a0b974695c85a69342.pack
Run Code Online (Sandbox Code Playgroud)
谢谢!
Andrew C的评论包含了这里的关键,但我会解释一下:
git fetch,没有其他参数,通过查看当前分支或使用来选择远程名称origin(有关详细信息,请参阅文档).选择了遥控器后,它将继续进行下一个表格.
git fetch remote再次没有其他参数,使用给定的遥控器,并提取该fetch =遥控器的行以获得一组"refspecs".然后它类似于最后一个案例.
git fetch remote refspec 使用给定的远程和给定的refspec(您可以在这里给出多个refspec)来选择要更新的引用.
一旦git fetch有远程或URL给定的远程名称,它就会提取该url =行以获取URL - 它与远程服务器上的其他git命令联系,并要求他们提供所有远程存储库引用的列表(分支,标记)和其他引用,都在refs/*名称空间中,有一个特殊的添加,HEAD也可以获得,但这里一般不使用 - 它在那里用于初始克隆步骤).
对于这样获得的每个引用,git fetch看看你是否要求它引用该引用,如果是,那么你要求git在你的存储库中使用什么名称.
同样,可用的名称是从遥控器获得的.该名想从你的refspecs获得,并且还可以从你的refspecs获得,他们将在你的仓库被赋予的名称.
表格的refspec a:b意味着"参考a,但在b本地调用".
缺少该b部分的refspec 意味着"参考a,但将其放入特殊FETCH_HEAD文件中".(FETCH_HEAD然后变得像普通的引用一样MERGE_HEAD,ORIG_HEAD等等,除了它有一些额外的文本写入它的pull脚本,所以它有时只能以你期望的方式工作.)
refspec可能包含通配符:refs/heads/*表示"占用所有分支"(根据定义,分支是以开头的引用refs/heads/).通常fetch =,你的git配置中的行说refs/heads/*:refs/remotes/origin/*.1 和以前一样,这意味着重命名匹配的分支,*右边扩展到*冒号左边的匹配.所以这会带来所有分支,但是将它们重命名为origin/master等.这通常是你想要一个非--bare存储库.
有时这也是你想要的--bare存储库,有时它不是.特别是,有时您需要一个"镜像"存储库,这是一个简单的克隆,只是从属副本一些其他存储库.要将普通的裸存储库更改为这样的镜像,您只需要修改该fetch =行:而不是refs/heads/*:refs/remotes/origin/*应该读取的行fetch = refs/heads/*:refs/heads/*.事实上,你可能想要带来所有东西(标签甚至笔记)fetch = refs/*:refs/*.当然,无论你真的想要这个,你都可以自己决定.
请注意,这是很常见的,它git clone有一个标志可以自动设置它:克隆,--mirror你会得到一个带有修改fetch =行的裸克隆.
1实际上该行读取+refs/heads/*:refs/remotes/origin/*,即还有一个主角+.此加号设置"强制标志",就像您使用过的那样git fetch --force,用于特定的参考更新.这与此处的拼写问题并不特别相关,但我会注意到,通常您需要对此处列出的远程分支进行强制更新,并且还要对纯镜像存储库进行强制更新.
如果你正在镜像标签,你可能希望那些做强制更新.当然,理想情况下,标签永远不会改变(也不会被删除),因此在理想的世界中,这无关紧要,但在现实世界中,它们有时会改变或被删除.
为了处理引用删除,你必须告诉git fetch给--prune(或类似地,供应--prune到git remote update).refspecs中没有自动修剪的语法(虽然这是合理的,我还没有看到任何提议).
| 归档时间: |
|
| 查看次数: |
1823 次 |
| 最近记录: |