Skip to main content

Cherry-pick commits across GitHub repositories using only the GitHub API

Project description

GitHub cherry-pick

Cherry-pick commits across GitHub repositories using only the GitHub API.

Uses the algorithm described by Jim's Stack Overflow answer to perform a cherry-pick entirely through the GitHub REST API. This is much better than doing that through patches (e.g. patch2pr), because git is much smarter with resolving conflicts on commits instead of patches.

When I used patch2pr, I had to constantly rebase my patches, because on almost every update they would raise conflicts. Cherry-picking those commits works perfectly fine!

Installation

Requires Python 3.10+, I recommend using uv, but it will work fine with pip or anything else.

uv tool install gh-cherry-pick

Or run directly without installing:

uvx gh-cherry-pick --help

Usage

This tool requires a classic token with repo and workflow permissions (workflow is needed only if commits update .github/workflows files) or a fine-grained token with contents and workflows permissions.

If you want to cherry-pick commits in private repositories, the tool also requires Pull requests permission for fine-grained tokens.

GITHUB_TOKEN=ghp_... gh-cherry-pick \
  --target MyOrg/nixpkgs@patched \
  `: # cherry-pick these commits` \
  NixOS/nixpkgs/3f5ba52cc4701bf341457dfe5f6cb58e0cbb7f83 \
  NixOS/nixpkgs/49ba75ed \
  `: # or merge the entire branch!` \
  Someone/nixpkgs@pr-branch \
  `: # or even cherry-pick every commit for a pull request!` \
  NixOS/nixpkgs#380691

Arguments

You can give commits, branches and or pull requests as positional arguments. Commits will be cherry-picked, while branches will be merged into the target. For pull requests, we will collect PR's commits and add it to the list of commits to cherry-pick.

Each commit/branch/PR is applied in order and builds upon the previous result.

  • --target: Required. Target branch to which to apply cherry-picks.
  • --first-hard-reset-to: Hard reset target to this commit, before doing anything else.
  • --pr-commits-limit: If you specify PR to cherry-pick, this is the maximum amount of commits that the pull request can have.
  • --token/-t: GitHub token. If not specified, falls back to the $GITHUB_TOKEN environment variable.

Supported formats:

For commits:

For branches:

For pull requests:

Development

uv sync
uv run pre-commit install

Then commit your changes and send a pull request!

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

gh_cherry_pick-1.5.0.tar.gz (61.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gh_cherry_pick-1.5.0-py3-none-any.whl (11.6 kB view details)

Uploaded Python 3

File details

Details for the file gh_cherry_pick-1.5.0.tar.gz.

File metadata

  • Download URL: gh_cherry_pick-1.5.0.tar.gz
  • Upload date:
  • Size: 61.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for gh_cherry_pick-1.5.0.tar.gz
Algorithm Hash digest
SHA256 4ecca0ccf03985598d084f244e556e5a2a82bb42853e5a1bf57fcee9d2c976b6
MD5 9574eaad5db3d378a2f494c0dcb8f490
BLAKE2b-256 171231cbc47c3cbe5489175f1e1200b11b1f0c69add16b1372c8567d4706f806

See more details on using hashes here.

Provenance

The following attestation bundles were made for gh_cherry_pick-1.5.0.tar.gz:

Publisher: publish.yml on PerchunPak/gh-cherry-pick

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file gh_cherry_pick-1.5.0-py3-none-any.whl.

File metadata

  • Download URL: gh_cherry_pick-1.5.0-py3-none-any.whl
  • Upload date:
  • Size: 11.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for gh_cherry_pick-1.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d01fb6fe67b5d6351f2170306b51e2fb0c9e9a38c712b647f16ee6cb25bb0341
MD5 5236f4fd85ebb3c819b82b6a268361c0
BLAKE2b-256 0a132fba662475e6cfea703fd8afca2006b081e99c681e5209acf8c61d74fd51

See more details on using hashes here.

Provenance

The following attestation bundles were made for gh_cherry_pick-1.5.0-py3-none-any.whl:

Publisher: publish.yml on PerchunPak/gh-cherry-pick

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page