🙆

gitリポジトリの特定ディレクトリを別のgitリポジトリにコピーする

2024/08/13に公開

zennとのリポジトリ連携をするにあたり、gitリポジトリの特定のディレクトリだけを連携する方法を紹介します。やり方としては以下の3つが考えられます。

  • rsync
  • git subtree[1]
  • git filter-repo[2]

rsync

rsyncによるファイル同期は単純なファイル同期のため、git履歴が消えてしまい検討外としました。

git subtree

git subtreeは有効なgitリポジトリを1つのリポジトリに集約するための用途として使えますが、今回は特定のディレクトリのみをミラーリングしたい。互いのgit履歴の管理は不要のため検討外としました。

git filter-repo

git filter-repoは、特定のディレクトリのみのgit履歴だけを取得して別リポジトリへのコピーが可能です。今回はgit filter-repoを利用することとしました。

ローカル環境での具体的なやり方は[2:1]を参照してください。以下はGitHub Actions上でのyamlを記載します。

github.com/{USERNAME}/{REPOSITORY_NAME}/{DIRECTORY}をgithub.com/{USERNAME}/zennへコピーします。

name: Sync Zenn Directory using git filter-repo

on:
  push:
    branches:
      - main

jobs:
  sync:
    runs-on: ubuntu-latest

    steps:
    - name: Install Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.x'

    - name: Install git-filter-repo
      run: |
        pip install git-filter-repo

    - name: Filter and sync directory
      run: |
        git clone https://{USERNAME}:${PERSONAL_ACCESS_TOKEN}@github.com/{USERNAME}/${REPOSITORY-NAME}.git
        cd ${DIRECTORY}
        git filter-repo --subdirectory-filter zenn
        git remote add zenn https://{USERNAME}:${PERSONAL_ACCESS_TOKEN}@github.com/{USERNAME}/zenn.git
        git push zenn main --force
      env:
         PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
  1. actions/checkout[3]を当初利用していたが、zennリポジトリにpushする際actions/checkoutで取得したリポジトリとの認証情報とコンフリクトした。
    git config --unset http.https://github.com/.extraheader=AUTHORIZATIONを利用すればzennリポジトリを参照可能。ただし、現時点では一番シンプルな方法を利用するとした。
脚注
  1. https://docs.github.com/ja/get-started/using-git/about-git-subtree-merges ↩︎

  2. https://docs.github.com/ja/get-started/using-git/splitting-a-subfolder-out-into-a-new-repository> ↩︎ ↩︎

  3. https://github.com/actions/checkout ↩︎

Discussion