リポジトリを 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 origin
freshrepo/.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
フォルダを削除する必要がある場合があります。
この内容はお役に立ちましたか?