Skip to content

Make some private GitHub repo directories public

License

Notifications You must be signed in to change notification settings

open-condo-software/gitexporter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

6ab3e23 · Mar 12, 2024

History

51 Commits
Mar 12, 2024
Dec 4, 2021
Dec 5, 2021
Dec 11, 2021
Dec 4, 2021
Dec 11, 2021
Mar 12, 2024
Mar 12, 2024
Dec 5, 2021
Dec 5, 2021
Dec 11, 2021

Repository files navigation

npm status gitexporter test status

gitexporter cli tool

You're in the right place if:

  • Do you have an open-source project with an open and closed part and you want to work in one git repo without git submodules?
  • Do you want to public some private GitHub repo directories?
  • You want to keep the authorship and history of the comments
  • You don't want to use git submodules

Others cases:

  • You are developing in a git mono repository and want to open-source some directories
  • You are developing some OpenSource project and want to disallow open some secret files

how it works ?

gitexporter create a new git repo from your existing repository with only allowed public files and dirs.

The gitexporter goes through the git commit tree and adds to a new repo only the allowed files.

Example

  • / -- monorepository root
  • /apps/service1 -- it's open source
  • /apps/optional-secure-service2 -- it's closed source
  • /gitexporter.config.json -- git exporter config file

gitexporter.config.json

{
    "forceReCreateRepo": true,
    "targetRepoPath": "my-open-source-repo",
    "sourceRepoPath": ".",
    "allowedPaths": ["apps/service1/*"],
    "ignoredPaths": ["apps/service1/.env", "apps/optional-secure-service2", "gitexporter.config.json"]
}

Just run npx gitexporter gitexporter.config.json and you will get a new git repository with just apps/service1 directory.

GITHUB ACTIONS CI EXAMPLE

  1. create a new user: sync-bot
  2. add new user ssh keys SSH_SYNC_BOT_PRIVATE_KEY: https://github.com/settings/keys
  3. add the user to org/private and org/open repo
  4. add SSH_SYNC_BOT_PRIVATE_KEY to org/private repo
  5. add CI files to org/private repo:

.github/workflows/gitexporter.yml

name: gitexporter
on:
  push:
    branches:
      - 'master'

jobs:
  gitexporter:
    name: Gitexporter
    runs-on: self-hosted
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          ssh-key: ${{ secrets.SSH_SYNC_BOT_PRIVATE_KEY }}
      - name: Checkout org/private
        uses: actions/checkout@v2
        with:
          repository: 'org/private'
          fetch-depth: 0
          submodules: recursive
          ssh-key: ${{ secrets.SSH_SYNC_BOT_PRIVATE_KEY }}
          path: gitexporter.source
          ref: 'master'
      - name: Checkout org/open
        uses: actions/checkout@v2
        with:
          repository: 'org/open'
          fetch-depth: 0
          submodules: recursive
          ssh-key: ${{ secrets.SSH_SYNC_BOT_PRIVATE_KEY }}
          path: gitexporter.target
          ref: 'master'
      - name: gitexporter.sh
        run: |
          bash .github/workflows/gitexporter.sh gitexporter.source gitexporter.target
          cat gitexporter.source.log.json

.github/workflows/gitexporter.sh

#!/usr/bin/env bash
set -eo pipefail

if [[ -z "$1" || -z "$2" ]]; then
  echo "use $0 <source-git-repo> <target-git-repo>"
  exit 2
fi

SOURCE_FOLDER=$1
TARGET_FOLDER=$2

echo "[GITEXPORTER]"
cat > ${SOURCE_FOLDER}.config.json <<EOF
{
  "forceReCreateRepo": false,
  "followByNumberOfCommits": true,
  "syncAllFilesOnLastFollowCommit": true,
  "logFilePath": "${SOURCE_FOLDER}.log.json",
  "targetRepoPath": "${TARGET_FOLDER}",
  "sourceRepoPath": "${SOURCE_FOLDER}",
  "allowedPaths": [
    "*"
  ],
  "ignoredPaths": [
    "secret/*"
  ]
}
EOF

npx gitexporter ${SOURCE_FOLDER}.config.json

echo "[TARGET/SETUP]"
cd ${TARGET_FOLDER}
git branch -D master || echo "no branch master"
git checkout -B master $(git rev-parse HEAD)
echo "[TARGET/PUSH]"
git push origin master
cd -
echo "[END]"