GitHubのリポジトリを分割してみた

どもです。

ずっと気なっていたこと、気にしていたことがあります。
それは…

いくつかのGitHubのリポジトリについて、1つのリポジトリに複数の内容が含まれてしまっている

ということです。

これにより、該当するGitHubのリポジトリ内容が分かりにくくなってしまっています。。

この問題を解決するために、GitHubから特定のフォルダの中身を別リポジトリに「抜き出す」、ということに挑戦しました。

単に「コピーする」のであれば、ホントに目的のリポジトリを別リポジトリに「コピーする」だけで完了します。
しかし今回挑戦するのは、特定のフォルダの変更履歴も含めて別リポジトリに「抜き出す」ということをしてみます。

1. 抜き出す環境

抜き出すGitHubのリポジトリ内のフォルダ構成です。

(repository clone root)
│
├─ LICENSE
├─ README.md
├─ tree.txt
│  
├─ sample_sub_dir_1
│   ├─ sample_001.txt
│   │  
│   └─ sub_dir_00_01
│        └ sub_text_message_00_01.txt
│          
└─sample_sub_dir_2
		sample_002.txt
		sample_text_file.txt

このリポジトリから「sample_sud_dir_1」の内容のみを別リポジトリに抜き出して、以下のような構成にしてみます。

(splitted from sample_sub_dir_1 repository root/)
├─ sample_001.txt
│  
└─ sub_dir_00_01
		└ sub_text_message_00_01.txt

2. 抜き出す手順

それでは早速、「抜き出す」手順を書きます。

  1. 以下のコマンドを実行して、抜き出し元のリポジトリのクローンします。

    git clone https://github/UserName/EXTRACT_SOURCE_REPOSITORY_NAME
  2. 次に、クローンしたリポジトリのフォルダに移動します。

    cd EXTRACT_SOURCE_REPOSITORY_NAME

    なお、実行環境によっては、"EXTRACT_SOURCE_REPOSITORY_NAME"の部分は異なってきますので、適宜確認してからこのコマンドは実行してください。

  3. 抜き出したいフォルダ「以外」のファイル、および変更履歴を削除します。

    git filter-branch --prune-empty --subdirectory-filter "./sample_sub_dir_1" main

    ここで、"sample_sub_dir_1″については、各自の実施環境や目的とするディレクトリのパスに合せて変更してください。

    また"main"についても、リポジトリの環境によっては"master"だったり別のブランチの名前だったりすると思います。
    コチラも適宜環境に合せて変更してください。

  4. 次に、抜き出し先のリポジトリを、GitHub上に作成します。

    1. GitHubのリポジトリ画面上の「New」をクリックして、リポジトリの作成画面を表示します。


    2. 「Create a new repository」画面で、「Repository name」に任意のリポジトリ名を入力します。



      リポジトリ名意外はデフォルト設定のままにして、「Create repository」ボタンを押下し、リポジトリの生成を実行します。

    以上で、抜き出し先のリポジトリの作成は完了です。

  5. 抜き出し先のリポジトリを作成したら、次にファイルと変更履歴を削除したリポジトリのリモートリポジトリに抜き出し先のリポジトリに設定します。
    (ココでは画像に合せて、「TeKiTo-Na-Name」としています。)

    git remote set-url origin https://github/UserName/TeKiTo-Na-Name
  6. 最後に、リモートリポジトリにデータをpushします。

    git push -u origin main

    “main"の部分については、各自の環境に合せて適宜変更、設定して下さい。

3. 抜き出した結果

実際に1. 抜き出す環境で記載した構成のリポジトリを抜き出してみました。
抜き出し元の変更履歴です。



次に、抜き出した先のリポジトリの変更履歴です。



履歴を見ると、「メッセージ」と「日時」の内容が一致していることが確認できます。
ただし、各コミットに対する「SHA-1」の値だけは異なっています。
これは、抜き出し時に行った変更履歴やファイルの削除が影響しているのかな、と考えています。
(詳しく調べていないので、正確なことは分かりません。)

4. まとめ

今回は、既存のリポジトリの特定のフォルダの内容を別のリポジトリに抜き出す、ということに挑戦してみました。
本文中に記載したコマンドを実行することで、確かに特定のフォルダの内容を別リポジトリに抜き出せることが確認できました。
これで(色々ツッコみ過ぎて)肥大化して内容が分かりにくくなってしまったリポジトリを分割し、管理をし易くできるのかと思います。

ではっ!

ex. コマンド一覧

今回のエントリで実行するコマンドを、一通り載せます。

git clone https://github/UserName/EXTRACT_SOURCE_REPOSITORY_NAME
cd EXTRACT_SOURCE_REPOSITORY_NAME
git filter-branch --prune-empty --subdirectory-filter "./sample_sub_dir_1" main

(ここで新規のリポジトリを作成する)

git remote set-url origin https://github/UserName/TeKiTo-Na-Name
git push -u origin main