Tech Hotoke Blog

IT観音とは私のことです。

【Git】ひとつのGitリポジトリからサブリポジトリに分割して管理する方法

f:id:TechHotoke:20211216134726p:plain

やりたいこと

./src
├── frontend
│   ├── node_modules
│   ├── public
│   └── src
--------------------------------
↑リポジトリAで管理 ↓リポジトリBで管理
--------------------------------
├── main
│   ├── java
│   └── resources
└── test
    └── java

ひとつのリポジトリからファイルを切り出して別のリポジトリで管理できるように分割する

方法

  1. メインとなるローカルリポジトリとリモートリポジトリを作成し、そちらにcommit /pushして、コードを格納する。 (手順は省略します)

  2. サブとなるリモートリポジトリを作成

  3. サブディレクトリを作成したい階層に移動して2で作成したリポジトリをクローン(先にローカル環境でディレクトリを作成している場合はこの手順は不要です)

  4. プロジェクトのルートディレクトリにて、下記コマンドを実行します。

git filter-branch --subdirectory-filter [任意のpath] HEAD

注意 pathを指定する際に/をpathの末尾に付けないと下記のようなエラーが発生しました。

failed to unpack tree object 
Could not initialize the index

上記コマンドを実行すると、下記のように履歴が書き換えられた旨が表示されます。

Ref 'refs/heads/main' was rewritten

試しにルートディレクトリでlsコマンドを実行してみると、frontend配下のソースのみ表示されるはずです。

  • サブディレクトリ配下のソースを格納するリモートリポジトリにpushする まずリモートリポジトリを登録します。(これをやらずにpushするとメインのリポジトリが書き換えられてしまうので慎重に・・・)
 git remote set-url origin [作成したリモートリポジトリのURL]

その後にサブディレクトリのソースたちをinitしてaddしてcommitしてから、pushします。 リモートリポジトリにソースが格納されて入れば完了です。 f:id:TechHotoke:20211118063658p:plain