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

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

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

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

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

リポジトリ 説明
splitpractice 演習用に作成された既存の Bitbucket リポジトリ。
bigdir The directory in splitpractice you split out.
freshrepo A new repository for holding the contents of bigdir. You'll create this using the directions below.

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

  1. Create new Git repository called freshrepo.
    This repository is under your account. 
  2. ローカル システムで、コマンドライン ウィンドウを開きます。
  3. Clone the splitpractice repository to your local system into the clone freshrepo.

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

    Cloning with this command creates a freshrepo directory on your local system that contains the splitpractice repository.

  4. Change directory into the root of the freshrepo.
  5. ディレクトリのコンテンツを一覧表示します。
    次の内容が表示されます。

    bigdir	lildir	lildir2

    At this point, freshrepo is a git repository that is linked back to the splitpractice repository on Bitbucket.

  6. Remove the link back to the Bitbucket remote splitpractice repository.

    git remote rm origin

    You can verify the command worked by listing the contents of the freshrepo/.git/config file.

  7. Remove anything from the repository that is not in the bigdir directory.

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

     This command goes through the history and files and removes anything that is not in bigdir.

  8. Link the local freshrepo repository to the freshrepo remote repository on Bitbucket.

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

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

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

    git push origin master

Now, view your freshrepo repository on Bitbucket. You'll find source files and their history show only the bigdir directory activity. The history for the "lil" directories. How do you know? Compare the original commit of splitpractice against your freshrepo repository. Notice, however, the history for source file 1 was retained by the move.

The new freshrepo/bigdir is totally separate from the original splitpractice/bigdir directory. If you were splitting a repository in a production environment, you would probably remove the splitptractice/bigdir folder from splitpractice.

 

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

Before you begin to split-out a directory, you should decide on a name for your new project. In this example, you'll use freshrepo for the new repository name. You'll be refactoring the hgsplitpractice repository an existing public repository on Bitbucket.  

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

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

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

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

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

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

  1. ブラウザで Bitbucket を開いてアカウントにログインします。
  2. Create a new Mercurial repository called hgfreshrepo.
    This is the remote repo where your new repository will end up. 
  3. ローカル システムでターミナルを開きます。
  4. Clone the hgsplitpractice repository to your local system.

    hg clone https://bitbucket.org/tutorials/hgsplitpractice

元のリポジトリをローカルで分割する 

The conversion extension takes a --filemap mapfile option.  The mapfile  can contain any of the following directives:

# comment line
include /path/to/file
exclude /path/to/file
rename from/file to/file

Splitting the hgsplitpractice requires calling the convert extension and passing it a mapfile

  1. リポジトリの親ディレクトリに移動します。
  2. Create a file called mymapfile.
  3. 次のディレクティブを追加します。

    include bigdir

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

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

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

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

  1. Change directory to the new hgfreshrepo.
  2. リポジトリを更新します。

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

    $ ls bigdir
    1 2 3 4 5 6 7 8 9
  4. Create a .hg/hgrc file in the repository.
  5. Add the URL for your remote hgfreshrepo to the configuration:

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

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

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

Now, view your hgfreshrepo repository on Bitbucket.  You'll find source files and their history show the full history.  How do you know? Compare the original commit of hgsplitpractice against your hgfreshrepo repository.  Notice, however, the history for source file 1 was retained by the move.

The new hgfreshrepo/bigdir is totally separate from the original hgsplitpractice/bigdir directory. If you were splitting a repository in a production environment, you would probably remove the hgsplitpractice/bigdir folder from hgsplitpractice.

最終更新日 2017 年 6 月 23 日

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

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