This is well explained under the title "Duplicating a Git repository". Taken from github article:
If you want to mirror a repository in another location, including getting updates from the original, you can clone a mirror and periodically push the changes.
# Make a bare mirrored clone of the repository
git clone --mirror https://github.com/exampleuser/repository-to-mirror.git
# Set the push location to your mirror
cd repository-to-mirror.git
git remote set-url --push origin https://github.com/exampleuser/mirrored
A mirrored clone includes all remote branches and tags, but all local references will be overwritten each time you fetch, so it will always be the same as the original repository. Setting the URL for pushes simplifies pushing to your mirror. To update your mirror, fetch updates and push, which could be automated by running a cron job.
git fetch -p origin
git push --mirror
If you want to automate this via code or a Ruby script, you can do it as well using the Git Duplicator Ruby gem.