リポジトリを 2 つに分割する
通常、コード リポジトリには複数のディレクトリがあります。プロジェクトの機能をリポジトリ内の対応する名前のディレクトリに分割したとします。リポジトリのコードを整理 (またはリファクタリング) する必要がある場合があります。たとえば、既存のプロジェクトのリポジトリのディレクトリを移動して、そのディレクトリのみのリポジトリを用意するようなことがあります。
リファクタリングを行う際には、古いプロジェクトのソース履歴を新しいプロジェクトでも保持することをおすすめします。このページでは、リポジトリを異なるディレクトリに移動すると同時に履歴を保持する方法について説明します。
Git を使用してディレクトリを分割する
ディレクトリを分割する前に、新しいプロジェクトの名前を決める必要があります。この例では、次のようにリファクタリングを行います。
| リポジトリ | 説明 |
|---|---|
splitpractice | 演習用に作成された既存の Bitbucket リポジトリ。 |
bigdir | 分割を行う splitpractice のディレクトリ。 |
freshrepo | bigdir のコンテンツを保持するための新しいリポジトリ。これは以降の手順を利用して作成します。 |
To run this example, log into Bitbucket Cloud and do the following:
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 master
Bitbucket で freshrepo リポジトリを確認します。ソース ファイルおよびそれらの履歴には、bigdir ディレクトリのアクティビティのみが含まれることがわかります。履歴は "lil" ディレクトリに対するもののみです。これを確認するには、splitpractice の元のコミットを freshrepo リポジトリと比較します。なお、ソース ファイル 1 の履歴は移動後も保持されています。
新しい freshrepo/bigdir は、元の splitpractice/bigdir ディレクトリとは完全に独立しています。本番環境でリポジトリを分割していた場合、splitpractice から splitptractice/bigdir フォルダを削除する必要がある場合があります。
Mercurial を使用してディレクトリを分割する
ディレクトリを分割する前に、新しいプロジェクトの名前を決める必要があります。この例では、新しいリポジトリの名前として freshrepo を使用します。Bitbucket の既存の公開リポジトリである hgsplitpractice リポジトリのリファクタリングを行います。
変換用の拡張機能の有効化
Mercurial の変換用の拡張機能を使用すると、ディレクトリを簡単に変換できます。これを使用する前に、拡張機能を有効化する必要があります。拡張機能の有効化は、次の手順で行います。
- ローカル システムでターミナルを開きます。
~/.hgrc構成ファイルを編集します。構成ファイルに次の内容を追加します。
[extensions] hgext.convert=- ファイルを保存して閉じます。
Bitbucket に新しいリポジトリを作成し、古いものをローカルにクローンする
次の手順を実行して、Bitbucket に新しいリポジトリを作成し、古いものをローカルにクローンします。
- ブラウザで Bitbucket を開いてアカウントにログインします。
hgfreshrepoという名前の新しい Mercurial リポジトリを作成します。
これは、新しいリポジトリの宛先になるリモート リポジトリです。- ローカル システムでターミナルを開きます。
ローカル システムに
hgsplitpracticeリポジトリのクローンを作成します。hg clone https://bitbucket.org/tutorials/hgsplitpractice
元のリポジトリをローカルで分割する
変換用のエクステンションは、--filemap mapfile オプションを利用します。mapfile には次の任意のディレクティブを含めることができます。
# comment line
include /path/to/file
exclude /path/to/file
rename from/file to/file
hgsplitpractice を分割するには、convert エクステンションの呼び出しと、そこに mapfile を渡すことが必要です。
- リポジトリの親ディレクトリに移動します。
mymapfile.という名前のファイルを作成します。次のディレクティブを追加します。
include bigdirすべてのファイル名はリポジトリのルートに対する相対パスです。
- ファイルを保存して閉じます。
リポジトリを変換します。
hg convert -s hg -d hg --filemap mymapfile hgsplitpractice hgfreshrepo
新しいリポジトリを Bitbucket にプッシュする
- 新しい
hgfreshrepoにディレクトリを変更します。 リポジトリを更新します。
hg update変換を確認するために、リポジトリの内容を表示します。
$ ls bigdir 1 2 3 4 5 6 7 8 9- リポジトリ内に
.hg/hgrcファイルを作成します。 リモートの
hgfreshrepoへの URL を構成ファイルに追加します。[paths] default = https://tutorials@bitbucket.org/tutorials/hgfreshrepoこの URL は、接続に使用しているプロトコルによって異なります。この例では、プロトコルは SSH ではなく HTTPS です。
- ファイルを保存して閉じます。
- 新しいリポジトリをコミットします。
- 変更を Bitbucket にプッシュします。
Bitbucket で hgfreshrepo リポジトリを確認します。ソース ファイルおよびそれらの履歴に、完全な履歴が表示されていることがわかります。これを確認するには、hgsplitpractice の元のコミットを hgfreshrepo リポジトリと比較します。なお、ソース ファイル 1 の履歴は移動後も保持されています。
新しい hgfreshrepo/bigdir は、元の hgsplitpractice/bigdir ディレクトリとは完全に独立しています。本番環境でリポジトリを分割していた場合、hgsplitpractice から hgsplitpractice/bigdir フォルダを削除する必要がある場合があります。