Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can forks be synced automatically in GitHub?

Stash enables automatic fork syncing if selected: https://confluence.atlassian.com/display/STASH/Keeping+forks+synchronized
It will update any branches in your fork that you haven't modified.

I've been unable to find similar automatic functionality in GitHub; all google searches are turning up manual ways to sync forks via your local cache.

like image 328
Malina Avatar asked May 21 '14 20:05

Malina


People also ask

How do I sync my GitHub forked repository?

On GitHub, navigate to the main page of the forked repository that you want to sync with the upstream repository. Select the Sync fork dropdown. Review the details about the commits from the upstream repository, then click Update branch.

How do you keep forks in sync?

Go to your fork, click on Fetch upstream and then click on Fetch and merge to directly sync your fork with its parent repo. You may also click on the Compare button to compare the changes before merging.

How do I sync my forked branch?

Go to your fork, click on Fetch upstream , and then click on Fetch and merge to directly sync your fork with its parent repo. You may also click on the Compare button to compare the changes before merging.

How do you sync forked with original GitHub desktop?

Click on the 'current branch' tab and first select 'master' as the current branch (if it's not already selected). Click on the 'fetch origin' button. Click on the 'current branch' tab again and click the 'choose a branch to merge into master' button at the bottom.


2 Answers

You could define a webhook to listen to upstream (the original repo) changes, and update your fork.

In June 2016, you had the service backstroke.us which listens to those events for you. No need to write your own listener.
See 1egoman/backstroke

But, as commented by chriszo111, in 2020, that would be wei/pull

a GitHub App built with probot that keeps your forks up-to-date with upstream via automated pull requests.

like image 85
VonC Avatar answered Sep 29 '22 16:09

VonC


For the record, recently I ran into this same problem and addressed it with Github Actions. The solution is rather easy: an scheduled action fetches the upstream repository and merges it into mine.

# .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 '[email protected]'            # "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  

I run it every Sunday which is more than enough for me. Just schedule this to whatever is fine for you.

Also, it is probably wiser to sync every branch in a different job since they will run in parallel and can independently succeed or fail if conflicts occur.

If you need to merge an arbitrary number of branches, you can refer to questions like How to fetch all Git branches to find shell tricks to do it.

I noticed a public action exists to address this by rebasing. It looked promising but it was fairly undocumented so here is my snippet instead. Hope it helps!

like image 33
N1ngu Avatar answered Sep 29 '22 18:09

N1ngu