如何获取足够的提交以在浅层克隆中进行合并

mad*_*jar 16 git merge shallow-clone

我正在尝试做什么:测试来自github的pull请求.我想在本地将pull请求合并到master中并对结果运行一些测试.由于存储库很大,我做了一个浅层克隆.

为了能够进行合并,我获取越来越多的提交(git fetch增加--depth),直到我merge-commit掌握了拉取请求.

但是,它每次都不起作用.看起来我不仅需要合并库,还需要master..merge_base范围内的每个提交.但我不确定该怎么做.

所以,问题是:如何获取足够的历史记录来进行合并?

Ada*_*dam 10

如果您有feature分支时的历史master但不想要 master 的完整历史,那么您可以估计分支日期并使用;

git fetch --shallow-since=<date> origin master
Run Code Online (Sandbox Code Playgroud)

很难使用任何其他形式的 ofgit fetch来做你想做的事情(查询远程的合并基础),因为git fetch获取 refs。可能没有您要查找的参考。

您可以使用以下脚本自动挖掘。

while [ -z $( git merge-base master feature ) ]; do     
    git fetch -q --deepen=1 origin master feature;
done
Run Code Online (Sandbox Code Playgroud)

  • 由于网络和 git 打包开销,执行如此多的获取仅更深一层似乎非常低效。也许更确切地说使用类似“deepen=100”的东西。 (3认同)

mmr*_*ins 5

我最近遇到了这个问题,找到了一种节省大量时间的方法,从 API获取合并基础提交,而不是下载足够的存储库信息来计算它https://docs.github.com/en/rest/commits /commits#比较两个提交

此 api 调用相当于

gh api \
  repos/my_github_user/my_repo/compare/main...my_pr_branch \
  | jq -r '.merge_base_commit.sha'"
Run Code Online (Sandbox Code Playgroud)

如果您愿意,也可以卷曲

curl -s -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/my_user/my_repo/compare/main...my_pr_branch
Run Code Online (Sandbox Code Playgroud)

这是我的 github 工作流程/操作的更多内容

      - name: Fetch merge base SHA from API
        run: |
          my_merge_base_cmd="gh api repos/github/github/compare/${{ github.event.pull_request.base.sha }}...${{ github.event.pull_request.head.sha }} | jq -r '.merge_base_commit.sha'"
          echo $my_merge_base_cmd
          my_merge_base=$(eval $my_merge_base_cmd)
          echo "MY_MERGE_BASE_SHA=$my_merge_base" >> $GITHUB_ENV

      - name: Fetch merge base SHA
        run: |
          echo $MY_MERGE_BASE_SHA
          git fetch \
            --no-tags \
            --prune \
            --progress \
            --no-recurse-submodules \
            --depth=1 \
            origin $MY_MERGE_BASE_SHA

      - name: Checkout merge base SHA
        run: |
          echo $MY_MERGE_BASE_SHA
          git checkout \
            --force \
            $MY_MERGE_BASE_SHA
Run Code Online (Sandbox Code Playgroud)

基本上,一旦我检查了合并基础 SHA,我就可以构建工件并比较我在 PR 分支上构建的工件

如果你需要合并基础和 PR之间的提交,你也必须浅获取它们,但至少使用合并基础你知道你的终点

请注意,最好使用sha,而不是refAPI 调用来获取合并基础,因为ref可以更改它指向的内容(例如,有人将 main 合并到其 PR 分支中),从而导致竞争条件。


Phi*_*ley 3

你需要的(我认为),以 catch-22 的方式,是 'git describe --all --first-parent' 来告诉你来自适当分支的给定提交的深度。然而,在进行浅层提取之前,我不确定如何从 Github 获取它;-)