我如何拉到裸存储库?

chi*_*ila 34 git

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

$ git pull
fatal: /home/gimenero/applib/git/libexec/git-core/git-pull cannot be used without a working tree.
Run Code Online (Sandbox Code Playgroud)

如何将更改推送到"主"?

Ben*_*mes 48

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

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

$ git fetch origin master:master
Run Code Online (Sandbox Code Playgroud)

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


ant*_*tak 29

更新时间:

$ git fetch origin +refs/heads/*:refs/heads/* --prune
Run Code Online (Sandbox Code Playgroud)

这是做什么的?

首先是旁白:当我们谈到一个名为"xyz"的分支时,git实际上将其称为refs/heads/xyz.但你可以xyz简短地输入" ",否则就会疯了.(顺便说一句,标签是refs/tags/xyz.)Plain 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)
Run Code Online (Sandbox Code Playgroud)
  • 这个例子告诉我们,他们有分支机构foo,abc,def而我们有(有)一个额外的:bar
  • 通知删除bar--prune和强制更新的def允许的+前缀.

这里是不是会发生什么,如果+--prune都不放过:

 * [new branch]            foo        -> foo
   4812558a5f..a6aeec6517  abc        -> abc
 ! [rejected]              def        -> def  (non-fast-forward)
Run Code Online (Sandbox Code Playgroud)

最后一件事:

将顶部的命令与以下命令进行比较:

$ git fetch origin +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/* [--prune]
Run Code Online (Sandbox Code Playgroud)

这基本上是我们打字时发生的事情git fetch origin [--prune]!