Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 

Repository files navigation

Git Double Deploy: Private (Gitea) + Public (GitHub) with Sparse Checkout & Filtered Branch


1. Clone Your Private Repo (Gitea)

git clone git@yourcompany.com:team/project.git
cd project

2. Add GitHub as a Second Remote (Public Repo)

git remote add public git@github.com:yourusername/project-public.git

Check remotes:

git remote -v
# origin  git@yourcompany.com:team/project.git (fetch)
# origin  git@yourcompany.com:team/project.git (push)
# public  git@github.com:yourusername/project-public.git (fetch)
# public  git@github.com:yourusername/project-public.git (push)

3. Enable Sparse Checkout Locally (Work Only on Public Files)

git sparse-checkout init --cone

4. Define Which Folders/Files to Checkout Locally

Example repo structure:

/src        # public source code
/docs       # public documentation
/config     # private configs
/secrets    # private secrets

Set sparse checkout to only public folders:

git sparse-checkout set src docs

Your working directory now contains only /src and /docs.


5. Work Normally on Your Main Branch

Add and commit changes only to public files:

git add .
git commit -m "Update public files"

6. Push Full Branch to Private Repo (Gitea)

Push your entire repo (including private files):

git push origin main

7. Create Filtered Branch to Remove Private Files Before Pushing to Public (GitHub)

git checkout -b public-filtered main
git rm -r --cached config secrets
git commit -m "Remove private files for public repo"
git push -f public public-filtered:main

8. Switch Back to Main Branch for Private Work

git switch main

Optional: Automate Filtering and Push with a Shell Script

Create push_public.sh:

#!/bin/bash

# Save current branch
current_branch=$(git branch --show-current)

# Switch to main
git checkout main

# Create or reset public-filtered branch
git branch -D public-filtered 2>/dev/null
git checkout -b public-filtered

# Remove private files
git rm -r --cached config secrets

# Commit changes
git commit -m "Remove private files for public repo"

# Push filtered branch to public remote main branch
git push -f public public-filtered:main

# Switch back to original branch
git checkout "$current_branch"

Make it executable:

chmod +x push_public.sh

Run to sync public repo:

./push_public.sh

Summary Table

Step Command/Example
Clone private repo git clone git@yourcompany.com:team/project.git
Add public remote git remote add public git@github.com:yourusername/project-public.git
Enable sparse checkout git sparse-checkout init --cone
Set sparse folders git sparse-checkout set src docs
Work and commit git add . && git commit -m "message"
Push full private branch git push origin main
Create filtered branch git checkout -b public-filtered main
Remove private files git rm -r --cached config secrets
Commit & push filtered git commit -m "Remove private files"
git push -f public public-filtered:main
Switch back to main git switch main

About

For engineers maintaining a dual-remote Git workflow with sparse checkout and branch filtering — pushing full code to a private (Gitea) repo and a public-safe version to GitHub.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors