github-default-branch
                                
                                 github-default-branch copied to clipboard
                                
                                    github-default-branch copied to clipboard
                            
                            
                            
                        Rename your default branch on GitHub
GitHub Default Branch
Rename your default branch on GitHub easily. By default it renames master to main, but is configurable using the --new and --old flags.
If provided with an --org, --user or (--org and --team) arguments, it will run on all repositories owned by that org, user or team. Alternatively, you can provide a --repo argument to edit a single repo. See Usage for more examples.
For each repo, this tool will:
- Create a new branch at the same commit SHA as the old one
- Update all open pull requests to point at the new branch
- Update the default branch for the repo
- Delete the old branch
- Update known URL patterns in source files
- Update any branch protections for $oldto$new. (This does not work with patterns, it has to be an exact match)
Installation
npm install -g github-default-branch
Development
git clone https://github.com/mheap/github-default-branch.git
cd github-default-branch
npm ci
Authentication
Create a personal access token with the repo scope. This is the value for <token> 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
Usage
# Rename master to main
github-default-branch --pat <token> --repo user/repo
# Rename dev to develop
github-default-branch --pat <token> --repo user/repo --old dev --new develop
# Rename all repos owned by an org
github-default-branch --pat <token> --org my-org-name
# Rename all repos owned by a user
github-default-branch --pat <token> --user my-user
# Rename all repos owned by a team
github-default-branch --pat <token> --org my-org-name --team my-team-slug
Set DEBUG="ghdb*" as an environment variable to see debug information
Options
| 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 | 
Skipping transforms
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.
Available transforms
| 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:
- Copy branch protections instead of updating if --skip-delete-old-branchis used (#26)
- Retarget draft releases (#30)
Replacements
Part of this script checks for the existence of files and updates their contents. Replacements are the mechanism for these updates.
How it Works
Each .js file in the replacements folder 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.
How to Add a Replacement
Add a file to replacements with 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: "<path to file in repo>",
    replacements: [
      {
        from: "<from string>",
        to: "<to string>",
      },
      {
        from: "<from string>",
        to: "<to string>",
      },
    ],
  };
};
The file with the path in your repo will have any line matching from be swapped out with to