如何从本地存储库中获取分离的 Git HEAD?

How to a fetch detached Git HEAD from a local repository?

pre-commit 挂钩期间(实际上是 Gerrit 中的 ref-update),存储库处于分离的 HEAD 模式( 很好)。

做一个 git clone path/to/my/repo 做 clone/fetch 这个提交,但我只想做一个 git fetch 并避免每次提交时克隆我的存储库(出于各种原因比如避免每次都更改文件时间戳)。

在先前克隆的存储库(如上)上执行 git fetch --all 不会 获取此分离的 head 提交。请注意,我 do 具有提交的 SHA1git checkout commit-sha1-here 也不起作用,因为它尚未被提取。

我确实知道只有远程分支被获取是设计的,但是由于 clone 可以获取分离的头,有没有办法更新我的克隆存储库以检索它们之后?我想避免每次都为此创建一个临时分支

最终目标是更新裸存储库的工作树(分离的 HEAD)。

在这里回答我自己的问题。

分离 HEAD 的

git pull 似乎不是设计所允许的,但是分离 HEAD 的 git push 是可能的(即,不是从接收端获取,而是从发送端推送):

$ git push <repository> +<sha1>:refs/remotes/origin/master

然后从接收它的存储库中:

$ git checkout <sha1>  # same as origin/master

注意:如果是当前分支或非基础存储库,默认情况下不允许推送到 refs/remotes/origin/master 而不是直接推送到 master,因此我们推送到原始引用。