我有一个“主”裸仓库和一个“个人”裸仓库。我想将“主”仓库中的更改更新到“个人”仓库,所以我运行:
$ git pull
fatal: /home/gimenero/applib/git/libexec/git-core/git-pull cannot be used without a working tree.
我该如何拉取推送到"main"的更改?
我有一个“主”裸仓库和一个“个人”裸仓库。我想将“主”仓库中的更改更新到“个人”仓库,所以我运行:
$ git pull
fatal: /home/gimenero/applib/git/libexec/git-core/git-pull cannot be used without a working tree.
我该如何拉取推送到"main"的更改?
git pull
做的是一个 fetch
后跟一个 merge
,而你不能在没有工作树的情况下合并。(如果出现冲突,就无处解决它们。)< /p >
< p > 相反,你可以只 fetch。假设你的主仓库在个人仓库上配置为名为 origin 的远程仓库:< /p >$ git fetch origin master:master
请注意,只有您个人仓库的主分支正在镜像主仓库的主分支时,此操作才会成功。否则,Git将拒绝非快进式拉取。
更新方式:
$ git fetch origin +refs/heads/*:refs/heads/* --prune
首先一个旁白:当我们提到一个名为“xyz”的分支时,Git 实际上会将其称为 refs/heads/xyz
。但是你可以使用 "xyz
" 作为简称,否则这将是一件疯狂的事情。(顺便说一下,标签是 refs/tags/xyz
。) 简单的 xyz
是有歧义的,因为它可能是一个分支,一个标签或提交哈希的前 N 个字母。另一方面,refs/heads/xyz
明确表示一个分支。
因此,即使你可以输入 git fetch origin foo:bar
来获取他们在你的存储库中命名为 bar
的 foo
分支,但你可以更明确地输入 git fetch origin refs/heads/foo:refs/heads/bar
来完成相同的操作。(虽然如果 foo
实际上是一个标签而不是分支,则后者将失败,因为他们的 refs/heads/foo
不存在。显式性胜过隐式性.)
git fetch origin refs/heads/*:refs/heads/*
表示所有他们的分支都属于我们。该命令运行时,就像将 *
部分替换为每个分支的分支名称一样。即 git fetch origin refs/heads/abc:refs/heads/abc refs/heads/def:refs/heads/def ...
(假设他们有名为 abc
和 def
的分支)。
--prune
选项表示我们在存储库中拥有但不存在于他们存储库中的与refs/heads/*
匹配的任何分支都会被删除。
最后,+
前缀允许非快进式获取。如果没有它,对需要强制更新的分支进行的任何更新都将被拒绝。
综上所述,最终结果是你的存储库中的分支看起来与他们的完全相同。
- [deleted] (none) -> bar
* [new branch] foo -> foo
4812558a5f..a6aeec6517 abc -> abc
+ a1b2c3d4e5...1a2b3c4d5e def -> def (forced update)
foo
、abc
和def
,而我们多了一个:bar
--prune
删除bar
和使用+
前缀强制更新def
是被允许的。如果没有使用+
和--prune
,将会发生以下情况:
* [new branch] foo -> foo
4812558a5f..a6aeec6517 abc -> abc
! [rejected] def -> def (non-fast-forward)
将顶部的命令与以下内容进行比较:
$ git fetch origin +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/* [--prune]
当我们键入git fetch origin [--prune]
时,实际上就是这样发生的!
push --mirror
的反向操作,后者是危险的(即使存在冲突也会替换,删除目标端上不存在于发送端的任何内容)。 - Stéphane Gourichon
git fetch --all
可以解决问题,但它并没有给出期望的结果(即如果在裸的“个人”仓库中执行git fetch --all
,然后进入非裸的“个人”仓库并执行git pull
,则不会拉取来自主仓库的任何更改)。 - Trevor Boyd Smith