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

vulvrdjw  于 2022-12-10  发布在  Git
关注(0)|答案(3)|浏览(131)

我想做的是:测试来自github的拉取请求。我想在本地合并一个拉取请求到master中,并对结果进行一些测试。由于仓库很大,我做了一个浅克隆。
为了能够进行合并,我获取越来越多的提交(git fetch--depth不断增加),直到我在主请求和拉请求之间获得merge-commit
但是,它并不是每次都有效。看起来我不仅需要merge-base,还需要master..merge_base范围内的每个提交。我不知道如何做到这一点。
所以,问题是:我如何获取足够的历史来进行合并?

a8jjtwal

a8jjtwal1#

如果你有featuremaster分支的历史记录,但不想知道master的全部历史记录,那么你可以估计一个分支日期并使用;

git fetch --shallow-since=<date> origin master

很难使用其他形式的git fetch来做你想要的事情(查询remote以获得合并基),因为git fetch获取的是引用,可能没有你要找的引用。
您可以使用以下脚本自动执行挖掘。

while [ -z $( git merge-base master feature ) ]; do     
    git fetch -q --deepen=1 origin master feature;
done
w1jd8yoj

w1jd8yoj2#

你需要的(我认为),以一种第二十二条军规的方式,是'git describe --all --first-parent'来告诉你来自适当分支的给定提交的深度。- )

h6my8fg2

h6my8fg23#

我最近遇到了这个问题,并发现了一种节省大量时间的方法,即从API获得merge-base提交,而不是下载足够的存储库信息来计算它https://docs.github.com/en/rest/commits/commits#compare-two-commits
此API调用相当于

gh api \
  repos/my_github_user/my_repo/compare/main...my_pr_branch \
  | jq -r '.merge_base_commit.sha'"

如果你喜欢的话也可以卷起来

curl -s -H "Authorization: token $GITHUB_TOKEN" \
  https://api.github.com/repos/my_user/my_repo/compare/main...my_pr_branch

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

- name: Fetch merge base SHA from API
        run: |
          my_merge_base_cmd="gh api repos/github/github/compare/${{ github.event.pull_request.base.ref }}...${{ github.event.pull_request.head.ref }} | 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

基本上,一旦我检查了合并基础SHA,我就可以构建工件,并比较我在PR分支上构建的工件
如果你需要合并库和PR之间的提交,你也必须浅获取它们,但是至少使用合并库你知道你的终点

相关问题