git:提取到裸仓库中后更新HEAD

时间:2019-02-18 09:59:50

标签: git

我在/var/lib/repos/myrepo.git上有一个裸仓库,我尝试通过以下操作对其进行更新:

$ cd /var/lib/repos/myrepo.git
$ git fetch

我从远程获取最新提交,但是HEAD指针未更新。如果我愿意

$ git log

如果我这样做的话,它只会向我显示更新之前的日志消息

$ git log FETCH_HEAD

我可以看到最新的提交。

我想更新HEAD以指向FETCH_HEAD的sha1,或者让我将裸仓库克隆到另一个位于FETCH_HEAD的目录中。但是,FETCH_HEAD引用在工作目录中不可用。

2 个答案:

答案 0 :(得分:1)

  

我有一个裸仓库

在光秃秃的存储库中,您没有具有文件系统,因此您没有任何要更新的参考。

  

...想要更新HEAD以指向FETCH_HEAD的sha1,


如何更新HEAD(克隆时将是默认分支)

在裸仓库中,如果您希望设置默认分支,请使用以下命令:

git symbolic-ref HEAD refs/heads/<branch_name>

在“常规” git存储库上,您可以执行以下操作:

  • 将当前分支更新为所需的提交:

    git reset FETCH_HEAD --hard
    
  • 验证已提交并存在于本地.git存储库中。
    既然您提到了您可以看到提交的日志,那么它应该在您的仓库中

    git show FETCH_HEAD
    

答案 1 :(得分:0)

使用git clone --bare制作的克隆具有默认的 empty 提取引用规范。这意味着,当您运行git fetch时,您将使用 no refspec有效地运行git fetch。这不是一个好计划。常规的--bare存储库应该被推送到

CodeWizard said一样,裸克隆没有工作树,但这是red herring的一部分。裸克隆仍然具有HEAD引用,这是指向其分支名称之一的符号引用。

您可能希望使用git clone --mirror制作一个克隆。这与裸克隆相同,只不过其默认访存引用规范为+refs/*:refs/*。这意味着在这样的克隆中运行git fetch会无条件更新其所有 引用以匹配上游存储库。

请注意,这种克隆不是旨在接收git push请求,因为在其中运行git fetch将会替换 所有与其在origin中设置的值的哈希ID映射。

但是,如果您想要一个裸克隆来更新其HEAD映射到的任何分支,则可以:

  • 使用HEAD
  • 查找其git branch --symbolic-ref HEAD的哪个分支是符号引用
  • 运行git fetch origin +refs/heads/name:refs/heads/name以更新该引用。

或者,如果您不打算在此存储库中重新分配HEAD,则可以运行:

git config remote.origin.fetch +refs/heads/master:refs/heads/master

(假设HEAD的名称解析为master),然后,普通的git fetch将仅更新master分支。