リポジトリを 2 つに分割する

通常、コード リポジトリには複数のディレクトリがあります。プロジェクトの機能をリポジトリ内の対応する名前のディレクトリに分割したとします。リポジトリのコードを整理 (またはリファクタリング) する必要がある場合があります。たとえば、既存のプロジェクトのリポジトリのディレクトリを移動して、そのディレクトリのみのリポジトリを用意するようなことがあります。

リファクタリングを行う際には、古いプロジェクトのソース履歴を新しいプロジェクトでも保持することをおすすめします。このページでは、リポジトリを異なるディレクトリに移動すると同時に履歴を保持する方法について説明します。

Git を使用してディレクトリを分割する

ディレクトリを分割する前に、新しいプロジェクトの名前を決める必要があります。この例では、次のようにリファクタリングを行います。

リポジトリ

説明

splitpractice

演習用に作成された既存の Bitbucket リポジトリ。

bigdir

分割を行う splitpractice のディレクトリ。

freshrepo

bigdir のコンテンツを保持するための新しいリポジトリ。これは以降の手順を利用して作成します。

この例を試すには、Bitbucket Cloud にログインして次の操作を行います。

  1. freshrepo という名前の新しい Git リポジトリを作成します。
    リポジトリは自身のアカウントの配下に作成します。 

  2. ローカル システムで、コマンドライン ウィンドウを開きます。

  3. splitpractice リポジトリをローカル システムの freshrepo にクローンします。

    1 git clone git@bitbucket.org:tutorials/splitpractice.git freshrepo

    このコマンドでクローンを行うと、splitpractice リポジトリを含む freshrepo ディレクトリがローカル システムに作成されます。

  4. ディレクトリを freshrepo のルートに切り替えます。

  5. ディレクトリのコンテンツを一覧表示します。
    次の内容が表示されます。

    1 bigdir lildir lildir2

    この時点では、freshrepo は Bitbucket の splitpractice リポジトリにリンクされている Git リポジトリです。

  6. Bitbucket のリモート splitpractice リポジトリへのリンクを削除します。

    1 git remote rm origin

    freshrepo/.git/config ファイルのコンテンツを一覧表示することで、このコマンドが正しく実行されたかどうかを確認できます。

  7. bigdir ディレクトリに含まれないすべてのデータをリポジトリから削除します。

    1 git filter-branch --index-filter 'git rm --cached -r lildir lildir2' -- --all

     このコマンドは履歴とファイルを確認し、bigdir に存在しないデータを削除します。

  8. ローカルの freshrepo ディレクトリを Bitbucket の freshrepo リモート リポジトリにリンクします。

    1 git remote add origin https://tutorials@bitbucket.org/tutorials/freshrepo.git

    追加する URL は、Bitbucket のリポジトリのクローン オプションから取得できます。この例では HTTPS を使用していますが、SSH を使用することもできます。

  9. 新しくリファクタリングされたリポジトリを Bitbucket にプッシュします。

    1 git push origin main

Bitbucket で freshrepo リポジトリを確認します。ソース ファイルおよびそれらの履歴には、bigdir ディレクトリのアクティビティのみが含まれることがわかります。履歴は "lil" ディレクトリに対するもののみです。これを確認するには、splitpractice の元のコミットfreshrepo リポジトリと比較します。なお、ソース ファイル 1 の履歴は移動後も保持されています。

新しい freshrepo/bigdir は、元の splitpractice/bigdir ディレクトリとは完全に独立しています。本番環境でリポジトリを分割していた場合、splitpractice から splitptractice/bigdir フォルダを削除する必要がある場合があります。  

その他のヘルプ