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

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

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

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

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

リポジトリ 説明
splitpractice 演習用に作成された既存の Bitbucket リポジトリ。
bigdir 分割を行う splitplace のディレクトリ。
freshrepo bigdir のコンテンツを保持するための新しいリポジトリ。これは以降の手順を利用して作成します。

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

  1. freshrepo という名前の Git リポジトリを新しく作成します。
    リポジトリはユーザーのアカウントの配下に作成します。 
  2. ローカル システムで、コマンドライン ウィンドウを開きます。
  3. splitpractice リポジトリをローカル システムの freshrepo クローンにクローンします。

    git clone git@bitbucket.org:tutorials/splitpractice.gitfreshrepo

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

  4. ディレクトリを freshrepo のルートに切り替えます。
  5. ディレクトリのコンテンツを一覧表示します。
    次の内容が表示されます。

    bigdir	lildir	lildir2

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

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

    git remote rm origin

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

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

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

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

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

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

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

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

    git push origin master

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

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

 

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

ディレクトリを分割する前に、新しいプロジェクトの名前を決める必要があります。この例では、新しいリポジトリの名前として freshrepo を使用します。Bitbucket の既存の公開リポジトリである hgsplitpractice リポジトリのリファクタリングを行います。  

変換用の拡張機能の有効化

Mercurial の変換用の拡張機能を使用すると、ディレクトリを簡単に変換できます。これを使用する前に、拡張機能を有効化する必要があります。拡張機能の有効化は、次の手順で行います。

  1. ローカル システムでターミナルを開きます。
  2. ~/.hgrc 構成ファイルを編集します。
  3. 構成ファイルに次の内容を追加します。

    [extensions]
    hgext.convert=
  4. ファイルを保存して閉じます。

Bitbucket に新しいリポジトリを作成し、古いものをローカルにクローンする

 次の手順を実行して、Bitbucket に新しいリポジトリを作成し、古いものをローカルにクローンします。

  1. ブラウザで Bitbucket を開いてアカウントにログインします。
  2. hgfreshrepo という名前の Mercurial リポジトリを新しく作成します。これは、新しいリポジトリの宛先になるリモート リポジトリです。 
  3. ローカル システムでターミナルを開きます。
  4. ローカル システムに 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 の転送が必要です。 

  1. リポジトリの親ディレクトリに移動します。
  2. mymapfile という名前の新しいファイルを作成します。
  3. 次のディレクティブを追加します。

    include bigdir

    すべてのファイル名はリポジトリのルートに対する相対パスです。

  4. ファイルを保存して閉じます。
  5. リポジトリを変換します。

    hg convert -s hg -d hg --filemap mymapfile hgsplitpractice hgfreshrepo

新しいリポジトリを Bitbucket にプッシュする

  1. ディレクティブを新しい hgfreshrepo に切り替えます。
  2. リポジトリを更新します。

    hg update
  3. 変換を確認するために、リポジトリの内容を表示します。

    $ ls bigdir
    1 2 3 4 5 6 7 8 9
  4. リポジトリ内に .hg/hgrc ファイルを作成します。
  5. リモートの hgfreshrepo への URL を構成ファイルに追加します。

    [paths]
    default = https://tutorials@bitbucket.org/tutorials/hgfreshrepo

    この URL は、接続に使用しているプロトコルによって異なります。この例では、プロトコルは SSH ではなく HTTPS です。

  6. ファイルを保存して閉じます。
  7. 新しいリポジトリをコミットします。
  8. 変更を Bitbucket にプッシュします。

Bitbucket で hgfreshrepo リポジトリを確認します。ソース ファイルおよびそれらの履歴に、完全な履歴が表示されていることがわかります。これを確認するには、hgsplitpractice の元のコミットを hgfreshrepo リポジトリと比較します。なお、ソース ファイル 1 の履歴は移動後も保持されています。

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

最終更新日 2017 年 6 月 23 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.