Gitlab - CI 分支与 HEAD 分支之间的 Git 差异

Posted

技术标签:

【中文标题】Gitlab - CI 分支与 HEAD 分支之间的 Git 差异【英文标题】:Gitlab - Git differences between branch in CI versus HEAD 【发布时间】:2021-07-05 18:34:39 【问题描述】:

我正在尝试获取执行 Gitlab CI 管道的分支与远程源(称为主)分支之间不同的文件列表。

据我了解,当 gitlab CI 管道运行时,它会克隆特定分支,并且看起来像是剥离了所有远程源和分支?

所以我做了一个 git fetch 来检索远程分支,这让我得到了 main (origin/main)

但是从那里我已经尝试了 git diff、git diff-tree、git diff merge-base 的所有组合,但我无处可去,并且被炒了。

有人有什么建议吗?

【问题讨论】:

您能否更准确地解释“执行 Gitlab CI 管道的分支与远程源(称为主)分支之间不同的文件列表”的含义? 您的 CI 系统可能已设置为进行单分支浅克隆。这意味着您根本没有其他提交。使用git fetch 可以解决问题,但您还应该考虑更改 CI 系统以使用完整克隆。但是,您需要权衡取舍。 @torek,这实际上是我所做的, git fetch 来解决浅克隆。 Gitlab CI 显然在创建管道时并没有执行我发现的完整克隆。因此,我在管道语句的顶部添加了 git fetch。 @LeGEC,基本上我的最终目标是获取该分支中已更改的文件列表,与生产中的主分支相比。 您可以撤消浅层单分支克隆,但它需要的不仅仅是一个 git fetch:请参阅 How do I “undo” a --single-branch clone?。这就是为什么我建议首先找到一种方法让 CI 系统进行完整克隆:这可能更简单。 【参考方案1】:

我不明白您定义的确切含义,但我认为您正在寻找:

git diff --name-only origin/main HEAD

或为:

git diff --name-only origin/main...HEAD # 3 dots

也许是--name-status 而不是--name-only

【讨论】:

一般来说,“区别”绝对是你的首选。第二个是别的东西,比如“HEAD 和它在“origin/head”分支中分支出来的版本之间的区别。也许在这种情况下它们会产生相同的结果,但使用第一个是语义上的即使这样更正确。 我会试一试,很难记住我尝试过的细节。因为我可能能够做一个 git fetch 来解决浅克隆,并以这种方式做 git diff,因为本地分支认为它是头部? 好的,任何搜索的人都可以跟进。 @LeGEC 是正确的。缺少的部分是关于删除浅克隆的评论。一旦我这样做了,并使用了第二行,我得到了正是我需要的东西。谢谢!

以上是关于Gitlab - CI 分支与 HEAD 分支之间的 Git 差异的主要内容,如果未能解决你的问题,请参考以下文章

多个分支中的.gitlab-ci.yml的多个版本

gitlab-ci.yml 仅在 master 分支上

GItLab CI/CD 只为开发分支添加变量

在 GitLab 中创建标签时查找源分支(使用 gitlab-ci.yml)

在 GitLab CI 中,合并请求的目标分支是不是有变量?

是否有可能在gitlab-ci中构建另一个分支到另一个目录?