No project description provided
Project description
delete-branches
✅ What does delete-branches do?
delete-branches deletes idle branches in GitHub repository.
exemptions: default branch, protected branches, head branches in PR, and user-specified exclude branches
⭐ Why switch to delete-branches?
- we reduce your supply chain risks with openssf best practices in our SDLC and operations.
- we share evidence of code coverage results in action (click Code Coverage » cron-tasks » badge-coverage).
- we can run using command line or GitHub Action Delete GitHub Branches.
🏃 Running delete-branches in GitHub action
Use the workflow examples below to create your own workflow inside .github/workflows/.
Example 1 - Summary (MOCK delete)
| Input | Workflow Spec | Notes |
|---|---|---|
scheduled run |
- cron: '30 17 * * *' |
Run daily at 5:30 pm UTC |
github token permissions |
contents: readpull-requests: read |
MOCK delete requires read permission |
dry-run |
true |
MOCK delete |
exclude-branches |
badges |
Branch badges is found and excluded |
max-idle-days |
10 |
Without new commits longer than 10 days |
Example 1 - Workflow (MOCK delete)
name: delete-github-branches
on:
schedule:
- cron: '30 17 * * *'
permissions:
contents: read
pull-requests: read
jobs:
delete-branches:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
- name: Run delete-branches
id: delete-branches
uses: tagdots/delete-branches@774994b535b7853251f338762a0b5fe829eece09 # 1.1.1
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
repo-url: ${{ github.repository }}
max-idle-days: 10
exclude-branches: 'badges'
dry-run: true
Example 2 - Summary (Permanent delete)
| Input | Workflow Spec | Notes |
|---|---|---|
scheduled run |
- cron: '30 17 * * *' |
Run daily at 5:30 pm UTC |
github token permissions |
contents: writepull-requests: read |
Delete requires write permission in contents |
dry-run |
false |
Permanent delete |
exclude-branches |
badges |
Branch badges is found and excluded |
max-idle-days |
10 |
Without new commits longer than 10 days |
Example 2 - Workflow (Permanent delete)
name: delete-github-branches
on:
schedule:
- cron: '30 17 * * *'
permissions:
contents: read
pull-requests: read
jobs:
delete-branches:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: read
- name: Run delete-branches
id: delete-branches
uses: tagdots/delete-branches@774994b535b7853251f338762a0b5fe829eece09 # 1.1.1
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
repo-url: ${{ github.repository }}
max-idle-days: 10
exclude-branches: 'badges'
dry-run: false
🖥 Running delete-branches from command line
Prerequisites
* Python (3.12+)
* GitHub fine-grained token (contents: write)
Setup delete-branches
~/work/test $ workon test
(test) ~/work/test $ export GH_TOKEN=github_pat_xxxxxxxxxxxxx
(test) ~/work/test $ pip install -U delete-branches
Example 1 - Run for help
(test) ~/work/test $ delete-branches --help
Usage: delete-branches [OPTIONS]
Options:
--dry-run BOOLEAN default: true
--repo-url TEXT e.g. https://github.com/{owner}/{repo} [required]
--exclude-branches TEXT e.g. 'exclude-branch-1, exclude-branch-2'
--max-idle-days INTEGER Max. no. of idle days (without commits) [required]
--version Show the version and exit.
--help Show this message and exit.
Example 2 - MOCK delete branches without new commits longer than 10 days
| Input | Input Detail | Result |
|---|---|---|
repo-url |
https://github.com/tagdots/test |
process repository tagdots/test |
max-idle-days |
10 |
Without new commits longer than 10 days |
exclude-branches |
test-1, test-2, badges |
Only branch badges is found and excluded |
dry-run |
true |
a. 3 branches exempted from delete: main, badges, pr-branch-01b. 6 branches NOT exempt from deletec. MOCK delete 2 of 6 NOT-exempt-from-delete branches |
(test) ~/work/test $ delete-branches --dry-run true --max-idle-days 10 --exclude-branches "test-1, test-2, badges" --repo-url https://github.com/tagdots/test
🚀 Starting Delete GitHub Branches (dry-run: True, exclude-branches: {'test-1', 'test-2', 'badges'}, max-idle-days: 10)
Current Time (UTC): 2025-08-20 17:08:32
Refined User Exclude Branch(es): {'badges'}
Default Branch : main
Protected Branch : main
Pull Request Head Branch : pr-branch-01
Total Number of Branches : 9
Total Number of Branches (Exempt-From-Delete) : 3
Total Number of Branches (Not-Exempt-From-Delete): 6
From 6 Not-Exempt-From-Delete Branch(es), 2 branch is idle more than 10 day(s)
-------------------------------------------------------------------------------------------------
(MOCK) Delete branch - last update UTC 2025-08-09 13:49:34: branch-test-001
(MOCK) Delete branch - last update UTC 2025-08-08 03:29:34: branch-test-005
Example 3 - Delete branches permanently without new commits longer than 10 days
| Input | Input Detail | Result |
|---|---|---|
repo-url |
https://github.com/tagdots/test |
process repository tagdots/test |
max-idle-days |
10 |
Without new commits longer than 10 days |
exclude-branches |
badges |
Branch badges is found and excluded |
dry-run |
false |
a. 3 branches exempted from delete: main, badges, pr-branch-01b. 6 branches NOT exempt from deletec. Delete 2 of 6 NOT-exempt-from-delete branches permanently |
(test) ~/work/test $ delete-branches --dry-run false --max-days 10 --exclude-branches "badges" --repo-url https://github.com/tagdots/test
🚀 Starting Delete GitHub Branches (dry-run: False, exclude-branches: {'badges'}, max-idle-days: 10)
Current Time (UTC): 2025-08-20 17:26:55
Refined User Exclude Branch(es): {'badges'}
Default Branch : main
Protected Branch : main
Pull Request Head Branch : pr-branch-01
Total Number of Branches : 9
Total Number of Branches (Exempt-From-Delete) : 3
Total Number of Branches (Not-Exempt-From-Delete): 6
From 6 Not-Exempt-From-Delete Branch(es), 2 branch is idle more than 10 day(s)
-------------------------------------------------------------------------------------------------
✅ Delete branch - last update UTC 2025-08-09 13:49:34: branch-test-001
✅ Delete branch - last update UTC 2025-08-08 03:29:34: branch-test-005
🔧 delete-branches command line options
| Input | Description | Default | Required | Notes |
|---|---|---|---|---|
repo-url |
Repository URL | None |
Yes | e.g. https://github.com/{owner}/{repo} |
dry-run |
Dry-Run | True |
No | - |
max-idle-days |
Maximum number of days without new commits | None |
Yes | enter number of days |
exclude-branches |
Branches excluded from deletion | None |
No | comma seperated branches e.g. "branch1, branch2" |
😕 Troubleshooting
Open an issue
🙏 Contributing
For pull requests to be accepted on this project, you should follow PEP8 when creating/updating Python codes.
See Contributing
🙌 Appreciation
If you find this project helpful, please ⭐ star it. Thank you.
📚 References
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file delete_branches-1.2.14.tar.gz.
File metadata
- Download URL: delete_branches-1.2.14.tar.gz
- Upload date:
- Size: 12.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
273e3b51e0f8729447d04708a21e8becbb7cb2bd8d827545d37ff5cde3990a20
|
|
| MD5 |
27ea0cb2b06c31024f3efab4a38a338a
|
|
| BLAKE2b-256 |
09d18a9b9b573a207df8bd5e9a0647d71a730211408f2bd644634fcbe903f993
|
File details
Details for the file delete_branches-1.2.14-py3-none-any.whl.
File metadata
- Download URL: delete_branches-1.2.14-py3-none-any.whl
- Upload date:
- Size: 8.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
411b3848e457244b29937c7d41bfa9ef92b482679a696a74c298784b7894a7c9
|
|
| MD5 |
6d80d8c973c3675e0003165af62ba281
|
|
| BLAKE2b-256 |
0d6dc73742659c1d6e97405b882f459147bc164cfa855c7d678441209a66602b
|