我试图找到 GitHub Action 中一个分支与另一个分支分离的提交的 SHA。
在本地,我可以通过运行来实现这一点git merge-base <commit> <commit>。我正在尝试在工作流程中实现相同的目标。
我有以下内容workflow.yaml:
name: "Find common ancestor"
on:
pull_request:
branches:
- master
jobs:
find:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Find common ancestor
run: git merge-base "$GITHUB_HEAD_REF" "$GITHUB_BASE_REF"
Run Code Online (Sandbox Code Playgroud)
当工作流在打开分支“dev”到“master”的拉取请求时运行时,工作流会报告以下错误:
2021-08-14T19:17:04.5732118Z fatal: Not a valid object name dev
Run Code Online (Sandbox Code Playgroud)
我所有的研究都表明需要设置获取深度。据我了解,如果不将 fetch-depth 设置为 0,则只会获取浅克隆。不幸的是,即使将 fetch-depth 设置为 0,工作流程也无法找到必要的引用,而且我也没有想法。
有谁知道为什么 merge-base 无法识别引用,或者知道寻找共同祖先的替代方法?
编辑:
运行时git branch -a,我发现 refs 前面带有remote/origin/*,这解释了为什么在调用时找不到它们merge-base。为什么我退房后无法访问当地分行?
对于一个项目,我正在创建一个类driver%,它应该是提供相同过程的不同模块的抽象层。该类将使用指定要使用的模块的参数进行初始化。
此外,我想driver%公开相同的过程但没有副作用,以方便使用驱动程序的单元测试类。
考虑以下:
module_one.rkt
#lang racket
(provide foo)
(define (foo)
(display "called from "module one"))
Run Code Online (Sandbox Code Playgroud)
module_two.rkt
#lang racket
(provide foo)
(define (foo)
(display "called from "module two"))
Run Code Online (Sandbox Code Playgroud)
driver.rkt
#lang racket
(require (prefix-in one: "module_one.rkt")
(prefix-in two: "module_two.rkt"))
(provide driver%)
(define driver%
(class object%
(super-new)
(init driver-choice)
(define choice driver-choice)
(define/public (foo)
(case choice
[(1) (one:foo)]
[(2) (two:foo)]
[else void]))))
Run Code Online (Sandbox Code Playgroud)
这满足了上述要求,但不是很优雅:对于每个公开的过程,必须添加另一个 case 表达式。这似乎没有必要,因为 API 的选择是在类实例化时做出的,所以选择在任何地方都是相同的。
对于这个问题,什么是更可接受的解决方案?我已经研究过使用local-require,但这似乎不起作用define/public。
非常感谢!