Sync filtered commits from private to public repository
Project description
git-sync-filtered
A thin wrapper around git-filter-repo for syncing filtered commits from a private repository to a public repository.
Overview
git-sync-filtered clones a private repository, filters it to only include specified paths using git-filter-repo, and pushes the result to a public repository's sync branch. This enables maintaining a public subset of a private repository while preserving commit history.
Installation
uv (recommended)
uv tool install git-sync-filtered
pip
pip install git-sync-filtered
uvx (run without installing)
uvx git-sync-filtered \
--private git@github.com:org/private.git \
--public git@github.com:org/public.git \
--keep src \
--keep docs
GitHub Actions
You can use this workflow to sync from your private repo to a public repo when the private repo receives a push.
In your private repository, create .github/workflows/sync.yaml:
name: Sync to Public Repo
on:
push:
branches:
- main
jobs:
sync:
uses: Merge-42/git-sync-filtered/.github/workflows/sync.yaml@v0.1.4
with:
private_repo: ${{ github.repositoryUrl }}
public_repo: git@github.com:org/public.git
keep: src docs
merge: true
secrets:
GH_TOKEN: ${{ secrets.GH_PAT }}
Required secrets:
GH_PAT- A GitHub Personal Access Token withreposcope (for pushing to the public repo)
Available inputs:
| Input | Description | Default |
|---|---|---|
private_repo |
Private repository URL | Required |
public_repo |
Public repository URL | Required |
keep |
Space-separated paths to keep | - |
keep_from_file |
File containing paths to keep | - |
sync_branch |
Sync branch name | upstream/sync |
main_branch |
Main branch name | main |
private_branch |
Private branch to sync from | main |
merge |
Merge into main after sync | false |
force |
Force push | false |
dry_run |
Dry run mode | false |
Usage
git-sync-filtered \
--private git@github.com:org/private.git \
--public git@github.com:org/public.git \
--keep src \
--keep docs
Using a paths file
Create a file with paths to keep (one per line, lines starting with # are comments):
src
docs
README.md
git-sync-filtered \
--private git@github.com:org/private.git \
--public git@github.com:org/public.git \
--keep-from-file paths.txt
Options
| Option | Description | Default |
|---|---|---|
--private |
Private repo path or URL | Required |
--public |
Public repo path or URL | Required |
--keep |
Paths to keep (specify multiple) | Required |
--keep-from-file |
File containing paths to keep | - |
--sync-branch |
Sync branch name | upstream/sync |
--main-branch |
Main branch name | main |
--private-branch |
Private branch to sync from | main |
--dry-run |
Show what would happen without making changes | false |
--merge |
Merge into main branch after sync | false |
--force |
Force push | false |
How It Works
- Clones the private repository
- Runs git-filter-repo to filter to only the specified paths
- Pushes filtered commits to the public repository's sync branch
- Optionally merges the sync branch into main
The sync branch can then be merged into main manually or with --merge.
Workflow
flowchart LR
A[Private Repo<br/>private-branch] -->|clone & filter| B[git-sync-filtered]
B -->|push| C[Public Repo<br/>sync-branch]
C -->|"merge<br/>(manual or with --merge)"| D[Public Repo<br/>main-branch]
Requirements
- Python 3.10+
- git >= 2.36.0
Sponsored by Merge 42
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 git_sync_filtered-0.1.4.tar.gz.
File metadata
- Download URL: git_sync_filtered-0.1.4.tar.gz
- Upload date:
- Size: 6.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
838efef2479d878cd39d6f8633b5ac852d4dd6551d745e807f0fefb4661b414f
|
|
| MD5 |
31a95a7f8a13c7a912674c05bdb0f3c8
|
|
| BLAKE2b-256 |
a213b792ea27581cf869eacf2f644a36b60dd64b6d1d7264baf64cd4152bf34c
|
File details
Details for the file git_sync_filtered-0.1.4-py3-none-any.whl.
File metadata
- Download URL: git_sync_filtered-0.1.4-py3-none-any.whl
- Upload date:
- Size: 7.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3fe6ffffdc9436f32c57b48fcb27a973852463f9d03502db9a64306eee183405
|
|
| MD5 |
18480cf16e5200f4e14e017a74840866
|
|
| BLAKE2b-256 |
3a859bebbf9a9597d12c508589c94e41f87ee05caf32c27b318fc8b31bf59ecf
|