Mercurial リポジトリのメンテナンス

このページの内容

お困りですか?

アトラシアン コミュニティをご利用ください。

コミュニティに質問

Mercurial リポジトリのサイズを適切に保つには、定期的なメンテナンスが必要です。他のバージョン管理システムからコードをインポートした場合、インポート後に不要なファイルをクリーンアップする必要がある場合があります。ここでは、Mercurial リポジトリから大きなファイルを削除することでリポジトリ サイズを縮小する方法について説明します。以下のトピックが含まれます。

リポジトリのサイズを縮小するもう一つの方法は、リポジトリを複数の小さなリポジトリに分割することです。この方法はリポジトリ内のディレクトリごとに実行可能で、ディレクトリごとにサブリポジトリを作成します。リポジトリの分割に関する詳細については、リポジトリの 2 分割 を参照してください。

大規模ファイルを見つける方法

大規模ファイルとは、一般的にサードパーティ製のライブラリ(jar ファイル、dll ファイル)、アプリケーションのコンパイル済みバージョン、(画像ファイルのような)バイナリ形式のメディア資産などです。通常、Mercurial はファイルの差分を保存するので、注意が必要です。バイナリ ファイルの内容を少し変更すると、多くのファイル、または大半のファイルでバイト数が変わる可能性があります。バイナリ ファイルに変更をコミットすることにより、Mercurial が大規模なファイルの全体または大半を複数回保存する可能性があります。  

Linux 環境の場合

Linux 環境で大規模ファイルを検索するには、次のパイプ コマンドを使用します。

$ find . -type f \( ! -regex ".*/\..*" \) -print | xargs ls -l | sort -k5,5rn | head

このコマンドは非表示ファイルとディレクトリを無視します。たとえば、このコマンドは .hg ディレクトリ内のすべてを無視します。ls の出力をサイズ順で並び替えし、head コマンドを使用して、上位 10 個の大規模ファイルを返します。たとえば、現在の Bitbucket チュートリアル リポジトリには、次の大規模ファイルがあります。

-rwxr-xr-x 1 manthony staff 548107 Feb 12 11:18 ./yearone.html
-rw-r--r-- 1 manthony staff 205672 Feb 12 11:18 ./images/mahmoud-darwish.gif
-rw-r--r-- 1 manthony staff 155848 Feb 12 11:18 ./images/so_many_activities.jpg
-rw-r--r-- 1 manthony staff 149472 Feb 12 11:18 ./images/EleanorRoosevelt.png
-rw-r--r-- 1 manthony staff 122251 Feb 12 11:18 ./images/AmbroseBierce.gif
-rw-r--r-- 1 manthony staff 112894 Feb 12 11:18 ./javascripts/foundation.js
-rw-r--r-- 1 manthony staff 109986 Feb 12 11:18 ./images/Deep-Thought.png
-rw-r--r-- 1 manthony staff 88873 Feb 12 11:18 ./images/AlbertEinstein.png
-rw-r--r-- 1 manthony staff 88387 Feb 12 11:18 ./images/willferrell.png
-rw-r--r-- 1 manthony staff 87721 Feb 12 11:18 ./images/NeilTysonOriginsA-FullSize.jpg

Windows 環境の場合

Windows 環境では、PowerShell を使用することを推奨します。Windows 7 で PowerShell を開くには、次の操作を行います。

  1. スタート ボタンをクリックします。
  2. Begin typing Powershell in the Search programs and files field.
  3. Windows PowerShell オプションを選択します。
    PowerShell コマンド ウィンドウが開きます。 
  4. リポジトリのルートに変更します。
  5. コマンドプロンプトで次のように入力します。

    gi -Path .\* -Exclude .hg | gci -r -ea 0 | sort Length -desc | select -f 10

    このコマンドは、.hg(メタデータ)ディレクトリのファイルを除く、リポジトリのファイルすべてを一覧表示します。システムは次のような出力を一覧表示します。

        Directory: C:\Users\manthony\Documents\tutorials
    
    Mode LastWriteTime Length Name
    ----------------------- ----
    -a---3/25/2013 10:00 AM548107 yearone.html
    
     Directory: C:\Users\manthony\Documents\tutorials\images
    
    Mode LastWriteTime Length Name
    ----------------------- ----
    -a---3/25/2013 10:00 AM 205672 mahmoud-darwish.gif
    -a--- 3/25/2013 10:00 AM 155848 so_many_activities.jpg
    -a--- 3/25/2013 10:00 AM 149472 EleanorRoosevelt.png
    -a--- 3/25/2013 10:00 AM 122251 AmbroseBierce.gif
    
     Directory: C:\Users\manthony\Documents\tutorials\javascripts
    
    Mode LastWriteTime Length Name
    ----------------------- ----
    -a--- 3/25/2013 10:00 AM 112894 foundation.js
    
    Directory: C:\Users\manthony\Documents\tutorials\images
    
    Mode LastWriteTime Length Name
    ----------------------- ----
    -a--- 3/25/2013 10:00 AM 109986 Deep-Thought.png
    
    Directory: C:\Users\manthony\Documents\tutorials
    
    Mode LastWriteTime Length Name
    ----------------------- ----
    -a---3/25/2013 10:00 AM91116 index.html
    
     Directory: C:\Users\manthony\Documents\tutorials\images
    
    Mode LastWriteTime Length Name
    ----------------------- ----
    -a---3/25/2013 10:00 AM 88873 AlbertEinstein.png
    -a---3/25/2013 10:00 AM 88387 willferrell.png

大規模ファイルの削除

大規模ファイルを削除するには、convert エクステンションと --filemap オプションを使用します。convert エクステンションはリポジトリをフィルタリングし、並列履歴を持つ新しいリポジトリを作成します。--filemap オプションでは、ファイル処理用のフィルターを指定する filemap ファイルを使用します。変換処理時、convert エクステンションは filemap を使用して、処理するチェンジセットを修正します。filemap を使用すれば、個別のファイルやディレクトリ全体を含めたり、名前を変更したり、除外したりできます。

例として、filemap ディレクティブの簡単なセットについて示します。

# Comment
include path/to/file
exclude path/to/file
rename from/file to/file

convert エクステンションと --filemap オプションの詳細については、ConvertExtension --filemap ドキュメントを参照してください。

変換によってリポジトリのファイルを縮小する例

次のようなディレクトリ構造のリポジトリを考えてみましょう。

repo
│─ doc
│─ commons-collections-3.2.1-javadoc.jar
│─ commons-io-2.0.1-javadoc.jar
└─ commons-lang-2.6-javadoc.jar
│─ lib
│─ commons-collections-3.2.1.jar
│─ commons-io-2.0.1.jar
└─ commons-lang-2.6.jar
└─ src
│─ commons-collections-3.2.1-sources.jar
│─ commons-io-2.0.1-sources.jar
└─ commons-lang-2.6-sources.jar

commons-lang 以外のすべてのライブラリを削除し、commons-io 用を除くすべての Javadoc を保持するには、リポジトリ ルートに次の filemap.txt ファイルを作成します。

include "repo"
exclude "repo/lib"
include "repo/lib/commons-lang-2.6.jar"

# the following include is optional
include "repo/doc"
exclude "repo/doc/commons-io-2.0.1-javadoc.jar"

次に、構造を変換するには、コマンドラインで次のコマンドを発行します。

hg convert --filemap filemap.txt initialHgRepo hgRepoAfterConversion

initialHgRepo は変換するリポジトリで、hgRepoAfterConversion は新しいリポジトリです。変換後の hgRepoAfterConversion リポジトリの構造は次のとおりです。

repo
│─ doc
│─ commons-collections-3.2.1-javadoc.jar
└─ commons-lang-2.6-javadoc.jar
│─ lib
└─ commons-lang-2.6.jar
└─ src
│─ commons-collections-3.2.1-sources.jar
│─ commons-io-2.0.1-sources.jar
└─ commons-lang-2.6-sources.jar

これで hgRepoAfterConversion リポジトリをチェックできます。

最終更新日 2016 年 11 月 22 日

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

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