リポジトリを 2 つに分割する
通常、コード リポジトリには複数のディレクトリがあります。プロジェクトの機能をリポジトリ内の対応する名前のディレクトリに分割したとします。リポジトリのコードを整理 (またはリファクタリング) する必要がある場合があります。たとえば、既存のプロジェクトのリポジトリのディレクトリを移動して、そのディレクトリのみのリポジトリを用意するようなことがあります。
リファクタリングを行う際には、古いプロジェクトのソース履歴を新しいプロジェクトでも保持することをおすすめします。このページでは、リポジトリを異なるディレクトリに移動すると同時に履歴を保持する方法について説明します。
Git を使用してディレクトリを分割する
ディレクトリを分割する前に、新しいプロジェクトの名前を決める必要があります。この例では、次のようにリファクタリングを行います。
リポジトリ | 説明 |
|---|---|
| 演習用に作成された既存の Bitbucket リポジトリ。 |
| 分割を行う |
|
|
この例を試すには、Bitbucket Cloud にログインして次の操作を行います。
freshrepoという名前の新しい Git リポジトリを作成します。
リポジトリは自身のアカウントの配下に作成します。ローカル システムで、コマンドライン ウィンドウを開きます。
splitpractice リポジトリをローカル システムの
freshrepoに複製します。git clone git@bitbucket.org:tutorials/splitpractice.git freshrepoこのコマンドでクローンを行うと、
splitpracticeリポジトリを含むfreshrepoディレクトリがローカル システムに作成されます。ディレクトリを
freshrepoのルートに切り替えます。ディレクトリのコンテンツを一覧表示します。
次の内容が表示されます。bigdir lildir lildir2この時点では、
freshrepoは Bitbucket のsplitpracticeリポジトリにリンクされている Git リポジトリです。Bitbucket のリモート
splitpracticeリポジトリへのリンクを削除します。git remote rm originfreshrepo/.git/configファイルのコンテンツを一覧表示することで、このコマンドが正しく実行されたかどうかを確認できます。bigdirディレクトリに含まれないすべてのデータをリポジトリから削除します。git filter-branch --index-filter 'git rm --cached -r lildir lildir2' -- --allこのコマンドは履歴とファイルを確認し、
bigdirに存在しないデータを削除します。ローカルの
freshrepoディレクトリを Bitbucket のfreshrepoリモート リポジトリにリンクします。git remote add origin https://tutorials@bitbucket.org/tutorials/freshrepo.git追加する URL は、Bitbucket のリポジトリのクローン オプションから取得できます。この例では HTTPS を使用していますが、SSH を使用することもできます。
新しくリファクタリングされたリポジトリを Bitbucket にプッシュします。
git push origin main
Bitbucket で freshrepo リポジトリを確認します。ソース ファイルおよびそれらの履歴には、bigdir ディレクトリのアクティビティのみが含まれることがわかります。履歴は「lil」ディレクトリに対するもののみです。これを確認するには、splitpractice の元のコミットを freshrepo リポジトリと比較します。なお、ソース ファイル 1 の履歴は移動後も保持されています。
新しい freshrepo/bigdir は、元の splitpractice/bigdir ディレクトリとは完全に独立しています。本番環境でリポジトリを分割していた場合、splitpractice から splitptractice/bigdir フォルダを削除する必要がある場合があります。
この内容はお役に立ちましたか?