【问题标题】:Set dynamic depth for git fetch command为 git fetch 命令设置动态深度
【发布时间】:2021-11-26 11:39:13
【问题描述】:

在我的 gitlab CI 中,默认情况下会获取最后 50 个提交。要更改这一点,我可以使用 extra flag 并且额外的标志接受 git fetch 命令的所有选项。

比如我可以改成

variables:
    GIT_FETCH_EXTRA_FLAGS: --depth 100

这样可以获取最后 100 个提交。

但我想获取自上次发布以来的所有提交(在我的情况下总是有一个标签)。在我的管道中,我已经在做类似的事情了

- tag=$(git describe --tags --abbrev=0)
- base=$(git rev-parse $tag)

获取带有最后一个标签的提交,我在管道中处理它。

是否可以动态设置深度,或者是否有其他选项可以使用最后一个标签?因为如果我设置了一个“硬编码”深度值并且在某个时间会有更多的提交,那么管道就会失败。

【问题讨论】:

  • 简短回答:没有。--shallow-since 选项带有日期,--depth 带有数字,仅此而已。
  • @torek 但我可以像git rev-list 33b14c62b...33ad6cecf | wc -l 这样计算深度。难道不能以这样的方式做到这一点吗?虽然我不确定,如果我能在这个variable 部分计算任何东西......
  • 您可以计算克隆所需的深度,但要做到这一点,您首先需要一个足够深的克隆来计算必要的深度。在这种情况下……你为什么要克隆?

标签: git gitlab gitlab-ci-runner


【解决方案1】:

您最好的选择是使用变量 GIT_STRATEGY: none 告诉 Runner 在设置作业时根本不要克隆/获取存储库,而是在您的脚本部分运行您自己的 git 命令。

例如:

...
A Job:
  stage: a_stage
  image: alpine:latest # super small image to promote quick CI pipelines
  variables:
    - GIT_STRATEGY: none
  before_script:
    - apk add git # See notes below
  script:
    - git ... # whatever you need to do
    - ...

注意:最简单的方法是在 CI 作业中安装所需的软件包,但每次管道运行时都会发生这种情况。最好create a custom image based on the image you're using, install the packages you need there, and use that image in CI

【讨论】:

  • 这是个好主意,但据我现在了解,问题是,我无法在远程存储库上运行 git 命令来计算深度。我必须让代表做一些计算。但是后来我已经拿了一个大的,所以没有意义
  • 如果您使用GIT_STRATEGY: none 变量,您的工作是一片空白,因此您应该能够在脚本部分执行任何您需要的操作,就像您在本地执行的操作一样。虽然我不太熟悉你想要实现的目标,但我可能会遗漏一些东西。
  • 可以肯定的是,我这边没有误解:如果我使用GIT_STRATEGY: none,则作业是空白的,因此根本没有获取存储库数据。如果我进行任何 git 计算来获取存储库的深度,它总是会失败,因为它是空白的。所以我必须先获取代表,做任何计算(比如搜索最新的标签和它的提交 sha)
  • 没错。跑步者要做的就是启动容器并开始执行您的脚本。作为我的一些管道的一个简单示例,我有安装依赖项、设置环境变量、将其全部打包为 tarball 并作为工件上传的作业。在我的部署工作中,我不再需要 repo,只需要 tarball,所以我使用这个变量并拉下工件,然后部署。
  • 我可以克隆 repo,但这并没有给我带来优势,因为那时我已经处理了大量数据,这是我想要避免的。
猜你喜欢
  • 2012-09-10
  • 2015-07-29
  • 2020-04-13
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2022-12-03
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多