gitlab ci 管道中的分离头 - 如何正确推送

use*_*695 13 git gitlab-ci

我在 CI 管道中的存储库的分离头方面遇到了一些问题。在管道的构建阶段,我运行一个脚本,该脚本更改特定文件。更改此文件后,将其推送到存储库。

before_script:
  - git config --global user.name "Bot"
  - git config --global user.email "ci@domain.com"
  - git status
script:
  - npx ts-node ./generate.ts
  - git push "https://git:${GIT_PUSH_TOKEN}@${CI_REPOSITORY_URL#*@}" "HEAD:main"
  - git status
Run Code Online (Sandbox Code Playgroud)

运行脚本给我输出

Fetching changes with git depth set to 50...
Initialized empty Git repository in /builds/fKSu5-y_/0/project/.git/
Created fresh repository.
Checking out 9b4a88be as main...

$ git status
HEAD detached at 9b4a88be

$ git push "https://git:${GIT_PUSH_TOKEN}@${CI_REPOSITORY_URL#*@}" "HEAD:main"
To https://gitlab.domain.com/project.git
9b4a88b..98be83e  HEAD -> main

$ git status
HEAD detached from 9b4a88b
Run Code Online (Sandbox Code Playgroud)

我不明白为什么git statusbefore_script 中的第一个已经给了我一个独立的头。

我认为管道通过初始获取创建了一个独立的存储库。所以问题是如何以正确的方式处理我的推送。在我的发布阶段,我正在运行semantic-release,如果我执行之前的推送,则会由于头部分离而失败。如果我禁用推送,语义发布将按预期工作。但我当然需要推动。我不明白我做错了什么。


更新

添加git checkout mainbefore_script 给我第一个git status预期的结果。但在推送命令之后,我仍然有分离的头 - 我不明白。

$ git checkout main
Branch 'main' set up to track remote branch 'main' from 'origin'.
Switched to a new branch 'main'

$ git status
On branch main
Your branch is up to date with 'origin/main'.

$ git push "https://git:${GIT_PUSH_TOKEN}@${CI_REPOSITORY_URL#*@}" "HEAD:main"
To https://gitlab.domain.com/project.git
  336b065..8299e43  HEAD -> main

$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)
Run Code Online (Sandbox Code Playgroud)

尽管推送在发布状态下起作用的所有内容semantic-release仍然不起作用。我确实得到:The local branch main is behind the remote one, therefore a new version won't be published.

sla*_*uth 12

我不明白为什么git statusbefore_script 中的第一个已经给了我一个独立的头。

我认为管道通过初始获取创建了一个独立的存储库。

你是对的,GitLab CI 确实会签出特定的提交,而不是某个分支。但是,您可以添加git checkout "$CI_COMMIT_REF_NAME"到您的before_script

before_script:
  - git config --global user.name "Bot"
  - git config --global user.email "ci@domain.com"
  - git checkout "$CI_COMMIT_REF_NAME"
  - git status
Run Code Online (Sandbox Code Playgroud)


Sal*_*ack 5

我花了很多时间尝试解决同样的问题,最后发现有git策略:https://docs.gitlab.com/ee/ci/runners/configure_runners.html#git-strategy

\n

设置后,fetch它将重新使用本地工作副本(如果不存在,则回退到克隆)。所以这就是为什么它第一次对我起作用,然后它停止工作并且我的签出分支落后并且前面的提交数量随着另一次提交而增加的原因。

\n

那么解决方案就非常简单了。您只需将GIT_STRATEGY变量定义为clone

\n
variables:\n  GIT_STRATEGY: clone\n
Run Code Online (Sandbox Code Playgroud)\n

以我的工作publish为例:

\n
publish:\n  stage: publish\n  rules:\n    - if: $CI_COMMIT_BRANCH == "master"\n      when: manual\n  variables:\n    GIT_STRATEGY: clone\n  script:\n    - git checkout -b $CI_COMMIT_BRANCH\n    - echo "define what you want to change"\n    - \'git commit -am "your commit message" || echo "No changes to commit"\'\n    - git push --set-upstream origin $CI_COMMIT_BRANCH\n\n
Run Code Online (Sandbox Code Playgroud)\n

您还可以clone在全局变量或管道配置中定义策略https://docs.gitlab.com/ee/ci/pipelines/settings.html#choose-the-default-git-strategy

\n