让你的分叉存储库与上游存储库保持同步是一件乏味的事情,通常我们必须使用命令行和一些 git 命令来做到这一点。

但是今天我为您提供了 3 种方法可以让您更简单 并且花费更少的时间,甚至可以自动同步它们!

视频

像往常一样,如果您是视觉学习者,或者只是喜欢看和听而不是阅读,这里有带有完整解释和演示的视频,公平地说,这是很多 more比这篇文章更完整

视频链接:https://youtu.be/VOakLctEC2Q

如果您更喜欢阅读,那么......让我们继续吧:)

1\。从 UI 同步

是的,因此您可以轻松同步分叉存储库的第一种方法是使用 GitHub 最近提供的功能直接在 UI 中

你可以直接进入你的仓库的主页,在代码部分,在你的分支是在源仓库之前还是之后的指示器旁边,你现在有这个“获取上游”按钮。

[自动分叉同步 UI](https://res.cloudinary.com/practicaldev/image/fetch/s--0T_YaKl1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/863ca9tr81krdu01r2ag.png)

单击该按钮,您可以比较源代码库中所做的更改与您的分叉代码库中所做的更改,还可以自动获取并合并它们到您的代码库中。

如果上游存储库的更改导致冲突,GitHub 将提示您创建拉取请求以解决冲突。

在这里观看整个演示

2\。新的 API

我为您提供的将分叉存储库与上游存储库同步的下一种方法需要更多设置,但随后它将允许您自动保持存储库同步。我说的是使用新的 GitHubmerge-upstreamAPI。这种方式比前一种方式灵活得多。

事实上,使用 API,您可以从许多不同的平台开始同步:您的 CLI、您开发的用于将治理应用于您的存储库的应用程序等等。因此,它还使您能够自动化整个过程,例如使用 cron 作业或计划操作。

对于这个例子,我将使用curl来调用 API。

首先要注意的是,这将是一个 POST 操作:

curl \
  -X POST 

进入全屏模式 退出全屏模式

然后,我们需要指定目标的 GitHub APIs 版本,在这种情况下,让我们使用 v3。您需要在标题中传递它:

  -H "Accept: application/vnd.github.v3+json"

进入全屏模式 退出全屏模式

接下来,授权merge-upstreamAPI 需要身份验证,当然,否则每个人都可以合并其他人的 repos :)

  -H "Authorization: token YOUR_GITHUB_PAT"

进入全屏模式 退出全屏模式

由于 GitHub 不赞成使用用户名和密码进行 API 身份验证,因此我使用的是个人访问令牌。这也需要作为标题传递。

要了解有关如何向 GitHub API 进行身份验证的更多信息,请查看此链接。

和一起查看以了解如何在 GitHub 中创建 PAT。

然后我们需要传递API的url:

https://api.github.com/repos/USER_OR_ORG/REPO_NAME/merge-upstream

进入全屏模式 退出全屏模式

这是不言自明的,您只需要分叉存储库的名称,以及拥有它的用户名或组织名称。

最后一步,我们需要告诉 GitHub 我们想要与上游仓库同步的分支:

  -d '{"branch":"main"}'

进入全屏模式 退出全屏模式

在此示例中,我告诉 API 我要同步main分支,但您可以指定上游和分叉存储库中存在的任何分支。

这是使用curl调用完整的 API 调用时的外观,使用我的用户帐户n3wt0n和我从 Microsoft 分叉一段时间的 repoopenhack-devops-team:

curl \
  -X POST \
  -H "Accept: application/vnd.github.v3+json" \
  -H "Authorization: token PAT_REMOVED_FOR_SECURITY_REASONS" \
  https://api.github.com/repos/n3wt0n/openhack-devops-team/merge-upstream \
  -d '{"branch":"main"}'

进入全屏模式 退出全屏模式

如果一切顺利,并且同步成功,我们将看到一条类似Status: 200 OK的消息,其中包含一个响应,它将为您提供操作的所有详细信息:

{
  "message": "Successfully fetched and fast-forwarded from upstream defunkt:main",
  "merge_type": "fast-forward",
  "base_branch": "defunkt:main"
}

进入全屏模式 退出全屏模式

如果存在冲突,API 将返回Status: 409 Conflict,您需要在合并前手动解决冲突。

在这里观看整个演示

3\。使用 GitHub 操作

我在幕后为您提供的最后一种方法仍然使用我们刚刚看到的新 API,但它抽象给用户,使其更易于使用和自动化。以至于我可以说这是我最喜欢的一个,也是因为它使用了 GitHub Actions

只有几个动作可以让你同步你的分叉存储库,但是这个fromdabreadman是我最喜欢的,因为它允许你使用 GITHUB_TOKEN 而不是你的 PAT。

该操作是完全可配置的,但最重要的部分如下:

- name: Sync and merge upstream repository with your current repository
  uses: dabreadman/sync-upstream-repo@v1.0.0.b
  with:
    # URL of gitHub public upstream repo
    upstream_repo: "https://github.com/actions/starter-workflows.git"
    # Branch to merge from upstream (defaults to downstream branch)
    upstream_branch: main
    # Branch to merge into downstream
    downstream_branch: master
    # GitHub Bot token
    token: ${{ secrets.GITHUB_TOKEN }}

进入全屏模式 退出全屏模式

操作字段是不言自明的。您需要传递给操作的最少信息是您想要同步的原始(上游)回购网址、您想要同步到的分叉回购中的分支以及令牌。

就我而言,我喜欢按计划运行,所以我的仓库应该始终与上游的同步(除非有冲突):

on:
  workflow_dispatch:
  schedule: 
  - cron: "0 13 * * 1"

进入全屏模式 退出全屏模式

我认为现在应该更清楚为什么这是我最喜欢同步分叉回购的方式,以及为什么它通常是我的推荐。

在此处观看整个演示

结论

当然,如果您只需要偶尔同步一次,使用 UI 就绰绰有余了。如果您对繁忙的存储库或自定义应用程序有复杂的要求,那么 API 就是您的最佳选择。

但是最后一个使用 GitHub Actions 对我来说是最佳选择

在下面的评论部分告诉我你如何将你的分叉回购同步到他们的上游,以及如果我们现在有其他选项会改变。

此外,您可能想在此处查看这个视频,我在这里谈论使用 GitHub Actions 自动化一切

喜欢、分享和关注我 🚀 了解更多内容:

📽YouTube

☕给我买杯咖啡

💖Patreon

📧通讯

🌐CoderDave.io 网站

👕商品

👦🏻脸书专页

🐱u200d💻GitHub

👲🏻推特

👴🏻领英

🔉播客

给我买杯咖啡

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐