【问题标题】:Can forks be synced automatically in GitHub?可以在 GitHub 中自动同​​步分叉吗?
【发布时间】:2014-07-10 16:17:04
【问题描述】:

如果选中,Stash 会启用自动分叉同步: https://confluence.atlassian.com/display/STASH/Keeping+forks+synchronized
它将更新您未修改的分支中的所有分支。

我一直无法在 GitHub 中找到类似的自动功能;所有谷歌搜索都在通过本地缓存手动同步分叉。

【问题讨论】:

  • 我不认为 GitHub 有这种功能,我认为你需要手动同步。
  • 这是一个很好的问题,我很烦恼
  • GitHub 有非常好的 API,包括 webhook 和合并。虽然我认为你不能单独使用 GitHub 来做到这一点,但我相信你可以制作(或找到)一个机器人,它可以在没有冲突的情况下自动将更改合并到一个 fork 中。

标签: github git-fork


【解决方案1】:

为了记录,最近我遇到了同样的问题,并通过 Github Actions 解决了这个问题。解决方案相当简单:计划的操作会获取上游存储库并将其合并到我的存储库中。

# .github/workflows/example.yml

name: Merge upstream branches
on:
  schedule:
     # actually, ~5 minutes is the highest
     # effective frequency you will get
    - cron:  '* * * * *'
jobs:
  merge:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Merge upstream
        run: |
          git config --global user.name 'your-name'
          git config --global user.email 'your-username@users.noreply.github.com'

          # "git checkout master" is unnecessary, already here by default
          git pull --unshallow  # this option is very important, you would get
                                # complains about unrelated histories without it.
                                # (but actions/checkout@v2 can also be instructed
                                # to fetch all git depth right from the start)

          git remote add upstream https://github.com/example/test.git
          git fetch upstream

          # Neither forget the -b opt,
          # the feature/x ref is ambiguous at this stage
          git checkout -b feature/x origin/feature/x
          git merge --no-edit upstream/feature/x
          git push origin feature/x

          git checkout master
          git merge --no-edit upstream/master
          git push origin master

          # etc

我每周日运行它,这对我来说绰绰有余。只需将其安排到适合您的任何时间。

此外,同步不同作业中的每个分支可能更明智,因为它们将并行运行,并且在发生冲突时可以独立成功或失败。

如果需要合并任意数量的分支,可以参考How to fetch all Git branches之类的问题,寻找shell技巧来实现。

我注意到存在一个通过变基来解决此问题的公开行动。它看起来很有希望,但它相当无证,所以这里是我的 sn-p。希望对您有所帮助!

【讨论】:

  • 不错。 GitHub 操作肯定比我的 webhook 答案更新。赞成。
  • 顺便说一句,如果您不想公开每个 repo 的凭据或配置,现在有一个不错的 Github 应用程序:github.com/apps/pull
  • @K.Symbol 对此表示感谢。非常有用。
【解决方案2】:

您可以定义一个 webhook 来监听上游(原始 repo)的变化,并更新您的 fork。

在 2016 年 6 月,您拥有服务 backstroke.us,它会为您侦听这些事件。无需编写自己的监听器。
1egoman/backstroke

但是,就像 commentedchriszo111 一样,在 2020 年,这将是 wei/pull

使用 probot 构建的 GitHub 应用程序,可通过自动拉取请求使您的分叉与上游保持同步。

【讨论】:

  • 仰泳已经结束,创建者链接到类似的方法,如 github.com/wei/pull 似乎正在积极维护,stackoverflow.com/a/54718489/3423823 中也提到过
  • 如果您喜欢 webhook 方法,您可能还想看看 n8n.io。它是开源的,可以自托管,但也提供云产品。它比 Zappier 和其他类似的付费供应商便宜得多。
  • @Vadorequest 有趣。当然,在 2020/2021 年,您现在拥有 GitHub Action 方法,例如 github.com/marketplace/actions/fork-sync
  • 是的,我可能也会为此使用 GitHub 操作,看起来工作量更少,而且对开源完全免费。
【解决方案3】:

您可以创建一个使用 Github API 定期检查上游 repo 的 Github 应用程序。找到更新后,使用 Github API 创建拉取请求,然后调用 updateRef 更新您的分支以匹配 master。

或者,只需安装这个完全可以做到这一点的 Github 应用

https://github.com/wei/pull

? 一个 GitHub 应用程序,可让您的存储库与上游更改保持同步。

【讨论】:

  • 这是一个评论而不是一个答案,因为它只是推荐一个已经编码的工具,而不是回答如何做到这一点的问题。
  • @Gendarme 原始发帖人说“所有谷歌搜索都在使用手动方式来同步分叉”,并要求采用自动化方式来实现。我已经稍微更新了答案以使其更加清晰。
猜你喜欢
  • 1970-01-01
  • 2016-05-28
  • 2011-10-04
  • 2020-01-29
  • 2012-03-28
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多