我如何拉到裸存储库?

时间:2011-09-01 18:23:37

标签: git

我有一个“主”裸存储库和一个“个人”裸存储库。我想将更改从“主”更新为“个人”,所以我运行:

$ git pull
fatal: /home/gimenero/applib/git/libexec/git-core/git-pull cannot be used without a working tree.

如何将更改推送到“main”?

2 个答案:

答案 0 :(得分:45)

git pull执行fetch后跟merge,如果没有工作树,则无法合并。 (如果出现合并冲突,将无处可解决合并冲突。)

相反,你可以只是获取。假设您的主存储库在您的个人存储库中配置为远程调用源:

$ git fetch origin master:master

请注意,只有当您的个人存储库的主分支镜像主存储库的主分支时,才会成功。否则,Git将拒绝非快进提取。

答案 1 :(得分:23)

更新:

$ 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来将您的foo分支作为名称bar存储在您的存储库中,您也可以更明确地键入git fetch origin refs/heads/foo:refs/heads/bar来执行相同的操作。 (虽然如果foo实际上是一个标签而不是分支,后者将失败,因为他们refs/heads/foo不存在。明确性ftw。)

git fetch origin refs/heads/*:refs/heads/*表示所有分支都属于我们。运行该命令,就好像*部分替换为其每个分支的分支名称一样。即git fetch origin refs/heads/abc:refs/heads/abc refs/heads/def:refs/heads/def ...(假设他们的分支名为abcdef)。

--prune选项表示我们的存储库中与refs/heads/*匹配但在其存储库中不存在的任何分支已删除

最后,+前缀允许非快进提取。没有它,对需要强制更新的分支的任何更新都将被拒绝。

总而言之,最终结果是您的存储库中的分支看起来与它们完全相同。

这是一个示例输出:

 - [deleted]               (none)     -> bar
 * [new branch]            foo        -> foo
   4812558a5f..a6aeec6517  abc        -> abc
 + a1b2c3d4e5...1a2b3c4d5e def        -> def  (forced update)
  • 该示例告诉我们他们有分支fooabcdef,而我们有一个额外的:bar
  • 请注意bar删除--prune并强制更新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]时发生的事情!