Rename your default branch on GitHub
Rename your default branch on GitHub easily. By default it renames
masterto
main, but is configurable using the
--newand
--oldflags.
If provided with an
--org,
--useror (
--organd
--team) arguments, it will run on all repositories owned by that org, user or team. Alternatively, you can provide a
--repoargument to edit a single repo. See Usage for more examples.
For each repo, this tool will:
$oldto
$new. (This does not work with patterns, it has to be an exact match)
npm install -g github-default-branch
git clone https://github.com/mheap/github-default-branch.git cd github-default-branch npm ci
Create a personal access token with the
reposcope. This is the value for in the examples.
If you don't want your token to be stored in your shell history, you can set
GITHUB_TOKENin the environment and that will be read instead
# Rename master to main github-default-branch --pat --repo user/repoRename dev to develop
github-default-branch --pat --repo user/repo --old dev --new develop
Rename all repos owned by an org
github-default-branch --pat --org my-org-name
Rename all repos owned by a user
github-default-branch --pat --user my-user
Rename all repos owned by a team
github-default-branch --pat --org my-org-name --team my-team-slug
Set
DEBUG="ghdb*"as an environment variable to see debug information
| Flag | Description | Default | | ------------- | ------------------------------------------------------------------------------------------------------------ | ------- | | --pat | GitHub API Token | N/A | | --old | The name of the branch to rename | master | | --new | The new branch name | main | | --repo | The repo to update (format: user/repo) | N/A | | --user | Update all repos owned by the provided user (example: my-user) | N/A | | --org | Update all repos in the provided org (example: my-org-name) | N/A | | --team | Update all repos in the provided team (example: my-team-name), only usable in combination with org parameter | N/A | | --dry-run | Output log messages only. Do not make any changes | false | | --skip-forks | Skips forked repositories | false | | --confirm | Run without prompting for confirmation | false |
You might want to skip any of the available transforms (such as deleting the old branch). You can add
--skip-[transform-name]to disable the transform e.g.
--skip-delete-old-branch.
| Transform | Description | | ----------------------- | ----------------------------------------------------- | | update-default-branch | Set the default branch of the repo to
$new| | retarget-pull-requests | Change the base for any open pull requests | | retarget-draft-releases | Change the
target_commitishfor any draft releases | | branch-protection | Update any branch protection rules to point at
$new| | delete-old-branch | Delete the
$oldbranch | | github-pages | Update GitHub Pages configuration |
Pending transforms:
--skip-delete-old-branchis used (#26)
Part of this script checks for the existence of files and updates their contents. Replacements are the mechanism for these updates.
Each .js file in the
replacementsfolder is given a chance to run during the content updating step of the script. Each file in replacements is expected to export a function, that function receives all of the options that are available to the outmost script.
If there is nothing to replace, then the script moves on to the next replacement.
Add a file to
replacementswith a .js extension
Like this:
module.exports = function ({ owner, // string - repo owner repo, // string - repo name old, // string - old branch name target, // string - new branch name octokit, // Octokit - oktokit instance verbose, // boolean - verbose flag isDryRun, // boolean - dry run flag }) { // code goes here return { path: "", replacements: [ { from: "", to: "", }, { from: "", to: "", }, ], }; };
The file with the path in your repo will have any line matching
frombe swapped out with
to