joshjohanning/Bulk GitHub Repository Settings Sync
Update repository settings in bulk for multiple GitHub repositories
View on GitHubTrust Signals
- Scorecard Score
- not yet scored
- Maintenance Recency
- Activelast commit Jun 30, 2026
- License
- MIT
Pinned Snippet
uses: joshjohanning/bulk-github-repo-settings-sync-action@4dbdb50fdadd0e336515a267c24c9a7c21b45b38 # v2.10.3tags can be moved; commit SHAs can't. why a SHA?
Inputs
| name | description | required | default |
|---|---|---|---|
| github-token | GitHub token for API access (requires repo scope) | yes | — |
| github-api-url | GitHub API URL (e.g., https://api.github.com for GitHub.com or https://ghes.domain.com/api/v3 for GHES). Instance URL is auto-derived. | no | ${{ github.api_url }} |
| repositories | Comma-separated list of repositories (owner/repo format) or "all" for all repos in the organization/user | no | — |
| repositories-file | Path to YAML file containing repository list (repos.yml for Option 1, settings-config.yml for Option 2) | no | — |
| owner | Owner (user or organization) name - required when using "all" for repositories or when using custom property filtering (must be an organization for custom properties) | no | — |
| custom-property-name | Name of the custom property to filter repositories by (organization custom property) | no | — |
| custom-property-value | Comma-separated list of custom property values to match. Repositories with any of these values will be included. | no | — |
| allow-squash-merge | Allow squash merging pull requests | no | — |
| squash-merge-commit-title | Default title for squash merge commits. Allowed values: PR_TITLE, COMMIT_OR_PR_TITLE | no | — |
| squash-merge-commit-message | Default message for squash merge commits. Allowed values: PR_BODY, COMMIT_MESSAGES, BLANK | no | — |
| allow-merge-commit | Allow merge commits for pull requests | no | — |
| merge-commit-title | Default title for merge commits. Allowed values: PR_TITLE, MERGE_MESSAGE | no | — |
| merge-commit-message | Default message for merge commits. Allowed values: PR_TITLE, PR_BODY, BLANK | no | — |
| allow-rebase-merge | Allow rebase merging pull requests | no | — |
| allow-auto-merge | Allow auto-merge on pull requests | no | — |
| delete-branch-on-merge | Automatically delete head branches after pull requests are merged | no | — |
| allow-update-branch | Always suggest updating pull request branches | no | — |
| immutable-releases | Enable immutable releases to prevent release deletion and modification | no | — |
| code-scanning | Enable or disable default code scanning setup | no | — |
| enable-default-code-scanning | DEPRECATED: Use code-scanning instead. Enable default code scanning setup. | no | — |
| secret-scanning | Enable or disable secret scanning for repositories | no | — |
| secret-scanning-push-protection | Enable or disable secret scanning push protection for repositories | no | — |
| private-vulnerability-reporting | Enable or disable private vulnerability reporting for repositories | no | — |
| dependabot-alerts | Enable or disable Dependabot alerts (vulnerability alerts) for repositories. Also enables the dependency graph. | no | — |
| dependabot-security-updates | Enable or disable Dependabot security updates for repositories | no | — |
| topics | Comma-separated list of topics to set on repositories (replaces existing topics) | no | — |
| dependabot-yml | Path to a dependabot.yml file to sync to .github/dependabot.yml in target repositories | no | — |
| dependabot-pr-title | Title for pull requests when updating dependabot.yml | no | chore: update dependabot.yml |
| gitignore | Path to a .gitignore file to sync to .gitignore in target repositories (preserves repo-specific content after marker) | no | — |
| gitignore-pr-title | Title for pull requests when updating .gitignore | no | chore: update .gitignore |
| rulesets-file | Comma-separated paths to JSON files, each containing a repository ruleset configuration to sync to target repositories | no | — |
| delete-unmanaged-rulesets | Delete all other rulesets besides those being synced | no | false |
| pull-request-template | Path to a pull request template file to sync to .github/pull_request_template.md in target repositories | no | — |
| pull-request-template-pr-title | Title for pull requests when updating pull request template | no | chore: update pull request template |
| workflow-files | Comma-separated list of workflow file paths to sync to .github/workflows/ in target repositories (e.g., "./workflows/ci.yml,./workflows/release.yml") | no | — |
| workflow-files-pr-title | Title for pull requests when updating workflow files | no | chore: sync workflow configuration |
| autolinks-file | Path to a JSON file containing autolink references to sync to target repositories | no | — |
| environments | Comma-separated list of environment names to sync (creates new environments only; existing environments are not updated) | no | — |
| environments-file | Path to a YAML or JSON file with detailed environment configurations (reviewers, wait timers, branch policies, deployment protection rules, branch name patterns) | no | — |
| delete-unmanaged-environments | Delete environments not defined in the environments configuration | no | false |
| copilot-instructions-md | Path to a copilot-instructions.md file to sync to .github/copilot-instructions.md in target repositories | no | — |
| copilot-instructions-pr-title | Title for pull requests when updating copilot-instructions.md | no | chore: update copilot-instructions.md |
| codeowners | Path to a CODEOWNERS file to sync to target repositories | no | — |
| codeowners-target-path | Target path for the CODEOWNERS file in repositories (.github/CODEOWNERS, CODEOWNERS, or docs/CODEOWNERS) | no | .github/CODEOWNERS |
| codeowners-pr-title | Title for pull requests when updating CODEOWNERS | no | chore: update CODEOWNERS |
| package-json-file | Path to a package.json file to use as source for syncing npm scripts and/or engines | no | — |
| package-json-sync-scripts | Sync npm scripts from package-json-file to target repositories | no | true |
| package-json-sync-engines | Sync engines field from package-json-file to target repositories (useful for Node.js version requirements) | no | true |
| package-json-pr-title | Title for pull requests when updating package.json | no | chore: update package.json |
| dry-run | Preview changes without applying them (logs what would be changed) | no | false |
| write-job-summary | Write a summary table to the GitHub Actions job summary | no | true |
| summary-heading | Custom heading for the GitHub Actions job summary | no | Bulk Repository Settings Update Results |
Outputs
| name | description |
|---|---|
| updated-repositories | Number of repositories successfully processed (changed + pending + unchanged) |
| changed-repositories | Number of repositories with reportable changes made this run (or would have in dry-run mode). Repos with only pending sync PRs are counted under pending-repositories instead. |
| pending-repositories | Number of repositories with an open sync PR that is already up-to-date and just needs merging (no action was taken this run) |
| unchanged-repositories | Number of repositories with no reportable changes (may include warnings) |
| failed-repositories | Number of repositories that failed to update |
| warning-repositories | Number of repositories that emitted warnings |
| results | JSON array of update results for each repository |