如何在 GIT 中重新附加分离的 HEAD

问题描述 投票:0回答:4

(我可以看到有很多关于此的问题,但我还没有找到能解决我的确切问题的问题)。

我正在运行 gitlab-ci,当运行程序检查我的代码时,它会作为一个独立的头进行检查。这是我在 runners 目录中运行

git status
命令时得到的结果。

git status
# HEAD detached at 847fe59
nothing to commit, working directory clean

我需要做的就是将这个头重新连接回我的开发分支,然后将

git pull
放入完整的存储库中,以便在 docker 容器中使用。我想 gitlab ci 只检查最后一次提交以保存克隆完整的存储库,这是可以理解的。

在我的

.gitlab-ci.yml
文件中,我尝试了以下操作...

- git checkout origin/$CI_BUILD_REF_NAME
- git pull

这会在控制台中提供以下输出...

    $ git checkout $CI_BUILD_REF_NAME
    Switched to a new branch 'develop'
    Branch develop set up to track remote branch develop from origin.
$ git pull
You are not currently on a branch. Please specify which
branch you want to merge with. See git-pull(1) for details.

有没有简单的方法可以重新连接头部?我见过的大多数解决方案都涉及这样一个事实:更改已提交到独立的头上,但对我来说情况并非如此。我只想在我的 docker 容器中获取完整的

develop
分支以及我所有的 git 历史记录。

或者如果有办法阻止 gitlab ci 检查分离的头,那也很棒。

git gitlab gitlab-ci gitlab-ci-runner
4个回答
22
投票

A 分离的 HEAD 只是一个包含提交的原始哈希 ID 的 HEAD。正如评论中所指出的,将其用于构建系统通常是相当合理的,无论是否是某种持续集成:您可以通过哈希 ID 查看特定提交,或者查看标签名称,但无论哪种方式

 HEAD
最终包含提交哈希 ID,现在保证稳定。

如果你确实想要有一个“附加”(非分离)HEAD,那么用 Git 术语来说,你所要做的就是运行

git checkout <branch-name>
。这会将分支的名称写入
HEAD
,现在
HEAD
已附加到该分支。这意味着根本不是
HEAD
,而是分支名称决定了哪个提交是当前的。任何更新分支名称的内容都会更改当前提交。

请注意,此属性only适用于分支名称,即位于

refs/heads/
名称空间中的名称。名称
origin/branch
通常是
refs/remotes/origin/branch
的简写,它不是分支名称;它是一个远程跟踪名称(有时称为远程跟踪分支,这是一组糟糕的单词,因为它确实听起来像“分支”,不是吗?)。向
git checkout
提供任何名称,可以解析为提交,但不是分支名称,会导致分离的 HEAD(无论如何,如果签出有效的话)。

如果你想有一个附加的 HEAD,它必须附加到一个分支名称,即名称以

refs/heads/
开头的引用。


0
投票

其他答案已经解释了很多背景,我意识到这个问题已经很老了,但是由于人们可能会来到这里寻找解决方案,所以你就去吧:

job:
  script:
    - git switch $CI_COMMIT_REF_NAME #returning to branch from detached HEAD
    - <your CI script>
  variables:
    GIT_DEPTH: 0
    GIT_STRATEGY: clone

注:

  1. 如果您打算使用它作为模板,不妨使用
    before_script:
  2. 您不妨使用
    git checkout
    而不是
    switch
    。然而
    checkout
    可以处理分支和路径,所以
    switch
    更有针对性。
  3. GIT_STRATEGY: clone
    GIT_DEPTH: 0
    告诉 GitLab 创建存储库的完整克隆,包括所有分支和提交。如果没有它,git 将无法识别该分支。
    GIT_DEPTH: 0
    表示所有提交都将被克隆。例如,据我所知,可以安全地将其设置为
    100

-2
投票

这对我有用

命令:

git checkout FETCH_HEAD

输出:

Previous HEAD position was 3cf5de5... Initial commit
HEAD is now at 600ea51... Sample Git Demo

-2
投票

我也遇到过同样的情况: 您始终可以创建一个新分支并将其与您分离的分支合并

© www.soinside.com 2019 - 2024. All rights reserved.