リポジトリを 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 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 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
フォルダを削除する必要がある場合があります。