ツール:mercurial

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
ツール:mercurial [2017/11/27 14:04] mumeiyamibitoツール:mercurial [2020/10/12 10:17] (現在) mumeiyamibito
行 12: 行 12:
  
 ===== インストール ===== ===== インストール =====
-  - インストール\\ <code bash>$ sudo apt-get install mercurial</code>+==== apt からのインストール ==== 
 +<code bash>$ sudo apt install mercurial</code> 
 + 
 +==== pip からのインストール ==== 
 +<code bash>$ sudo -H pip3 install mercurial</code> 
 + 
 +  * 最新版がインストールされる。 
 +  * ''libbz2-dev'' と ''libffi-dev'' が必要。 
 + 
 +==== 初期設定 ==== 
   - 設定   - 設定
     * ホームディレクトリに .hgrc を作成して編集する\\ <code>     * ホームディレクトリに .hgrc を作成して編集する\\ <code>
行 100: 行 110:
   * 直前のcommit, pull, import, unbundle を 1 回だけ取り消す   * 直前のcommit, pull, import, unbundle を 1 回だけ取り消す
   * 作業領域は変更しない   * 作業領域は変更しない
 +
 +
 +==== 誤って複数のファイルをコミットした場合の取り消し ====
 +  * mercurial では、一度 ''add'' したものは ''remove'' や ''forget'' するまで常にトラッキングされる。
 +  * 特定のファイルのみのコミットの場合、コミットの章で触れたように、''hg commit FILE'' としてファイルを指定する。
 +  * 指定を忘れて誤って全体をコミットしてしまった場合に戻す方法は ''rollback'' 以外では以下の通りである (事前に ''MQ'' エクステンションを有効にしておく必要あり)。\\ <code bash>
 +$ hg qimport -r REV_ID
 +$ hg qrefresh FILE
 +$ hg qfinish -a
 +</code>
 +    * ''REV_ID'': 修正したいリビジョン番号
 +    * ''FILE'': 本来コミットするはずだったファイル群
 +    * これで特定のファイルのみのコミットの修正される。
 +    * ''qimport -r'' の後に、''hg qseries -s'' や ''hg qdiff'' などで誤ったリビジョンの確認をすると確実。
  
 ==== リビジョン表示 ==== ==== リビジョン表示 ====
行 239: 行 263:
     * [[http://stackoverflow.com/questions/12843/how-to-combine-two-projects-in-mercurial | How to combine two projects in Mercurial? - Stack Overflow]]     * [[http://stackoverflow.com/questions/12843/how-to-combine-two-projects-in-mercurial | How to combine two projects in Mercurial? - Stack Overflow]]
  
 +==== 特定ファイルのみのリポジトリを別に作りたい ====
 +  * 上記の複数リポジトリの統一とは逆に、特定ファイルのみの別リポジトリにして管理する方法\\ <code bash>$ hg convert /path/to/original_repository /path/to/new_repository --filemap map.txt</code>
 +    * ''/path/to/original_repository'': コピー元のリポジトリのパス
 +    * ''/path/to/new_repository'': 新たに作成する特定ファイルのみの別リポジトリのパス
 +    * ''map.txt'': フィルタ条件を書き込んだファイル\\ <code txt map.txt>
 +include INCLUDE_FILE_PATH
 +exclude EXCLUDE_FILE_PATH
 +rename ORIGINAL_PATH RENAMED_PATH
 +</code>
 +      * ''INCLUDE_FILE_PATH'': リポジトリコピーの際に、コピーするファイルのパス (リポジトリのトップパスがベース)
 +      * ''EXCLUDE_FILE_PATH'': リポジトリコピーの際に、外したいファイルのパス (リポジトリのトップパスがベース)
 +      * ''ORIGINAL_PATH'': リポジトリコピーの際に、名前を変更したいファイルのパス (リポジトリのトップパスがベース)
 +      * ''RENAMED_PATH'': リポジトリコピーの際に、名前変更後のパス (リポジトリのトップパスがベース)
 +      * ''include'' も ''exclude'' も指定していない場合、すべてのファイルがコピーされる。
 +      * ''rename'' は事前に ''include'' しておく必要あり (''rename'' だけではコピーされない)
 +      * これらの指定は 1 ファイルにつき、1 行使う (''include'' や ''exclude'' の後に、ファイルのパスを続けて指定するとエラーが出る。)
 +      * 例: リポジトリ内の ''class/class1.py'' と ''class/class2.py'' のみのリポジトリを作成する (''class1.py'' はリポジトリのトップに ''class_main.py'' として配置する)\\ <code>
 +include class/class1.py
 +include class/class2.py
 +rename class/class1.py class_main.py 
 +</code>
 +  * 事前にエクステンションを有効化する必要があるため、''.hgrc'' の ''[extensions]'' 以下に追記する。\\ <code>
 +[extensions]
 +convert=
 +</code>
 +  * 参考サイト: 
 +    * [[https://www.mercurial-scm.org/wiki/ConvertExtension | ConvertExtension - Mercurial]]
 +    * [[https://www.medo64.com/2010/09/extracting-part-of-mercurial-repository/ | Extracting Part of Mercurial Repository – Medo's Home Page]]
 +
 +==== リポジトリを修復したい ====
 +  * 何らかの処理によって、mercurial の管理ディレクトリ内のデータが破損した場合、mercurial の操作をしようとすると ''abort: data/FILE.i@XXXXXXXXXXXX: no match found!'' というエラーが現れることがある (''FILE'' はその名前のファイルのトラッキングデータ)。
 +  * 修復するには以下のコマンドを実行すると復旧できる可能性がある\\ <code bash>$ hg convert --config convert.hg.ignoreerrors=True SOURCE_REPO DEST_REPO</code>
 +    * ''SOURCE_REPO'': 修復したいリポジトリ (mercurial で管理しているディレクトリ)
 +    * ''DEST_REPO'': 修復後のリポジトリの出力先
 +  * 参考サイト: [[http://cointoss.hatenablog.com/entry/2012/09/11/211223 | Mercurial で壊れたリポジトリを復旧する方法 - secretbase.log]]
 ==== SSH が利用できるリモートサーバとの連携 ==== ==== SSH が利用できるリモートサーバとの連携 ====
-  * リモートサーバにリポジトリを作成\\ <code bash>$ hg clone . ssh://USER_NAME@SERVER_NAME/path/to/new_repository</code> +  * mercurial のサーバ構築のサイトの多くは Apache を使った方法を紹介しているが、ただバージョン管理のストレージとして使いたい場合には大掛かり過ぎる気がする (Apache を設定すれば、ウェブ上で公開することが可能である)。ここでは、バージョン管理のストレージとして使う場合を想定して紹介する。 
-    * ''USER_NAME'': SSH のユーザ名 +  * サーバ構築 
-    * ''SERVER_NAME'': SSH のサーバ名 (IP アドレス) +    * SSH サーバ + mercurial がインストールされている環境を構築すれば良い (構築方法は他のサイトを参照)。 
-    * ''path/to/new_repository'': サーバ内のパス (''USER_NAME'' が指定されているのであれば、''/home/USER_NAME'' が起点になる) +  * クライアント側の設定 (オプション) 
-  * プッシュ\\ <code bash>$ hg push ssh://USER_NAME@SERVER_NAME/path/to/repository</code> +    * SSH を公開鍵設定やポート変更をしている場合、''~/.hgrc'' の ''[ui]'' に SSH の設定を追記することで利用できる。\\ <code config>[ui] 
-    * ''USER_NAME'': SSH のユーザ名 +ssh = ssh -i PRIVATE_KEY -p PORT</code> 
-    * ''SERVER_NAME'': SSH のサーバ名 (IP アドレス) +      * ''PRIVATE_KEY'': 秘密鍵のパス 
-    * ''path/to/repository'': サーバ内のパス (''USER_NAME'' が指定されているのであれば、''/home/USER_NAME'' が起点になる) +      * ''PORT'': ポート番号 
-  * クローン\\ <code bash>$ hg clone ssh://USER_NAME@SERVER_NAME/path/to/repository</code> +  * 使い方 (クライアント側) 
-    * ''USER_NAME'': SSH のユーザ名 +    * リモートサーバにリポジトリを作成\\ <code bash>$ hg clone . ssh://USER_NAME@SERVER_NAME/path/to/new_repository</code> 
-    * ''SERVER_NAME'': SSH のサーバ名 (IP アドレス) +      * ''USER_NAME'': SSH のユーザ名 
-    * ''path/to/repository'': サーバ内のパス (''USER_NAME'' が指定されているのであれば、''/home/USER_NAME'' が起点になる) +      * ''SERVER_NAME'': SSH のサーバ名 (IP アドレス) 
-  * プル\\ <code bash>$ hg pull ssh://USER_NAME@SERVER_NAME/path/to/repository</code> +      * ''path/to/new_repository'': サーバ内のパス (''USER_NAME'' が指定されているのであれば、''/home/USER_NAME'' が起点になる) 
-    * ''USER_NAME'': SSH のユーザ名 +    * プッシュ\\ <code bash>$ hg push ssh://USER_NAME@SERVER_NAME/path/to/repository</code> 
-    * ''SERVER_NAME'': SSH のサーバ名 (IP アドレス) +      * ''USER_NAME'': SSH のユーザ名 
-    * ''path/to/repository'': サーバ内のパス (''USER_NAME'' が指定されているのであれば、''/home/USER_NAME'' が起点になる)+      * ''SERVER_NAME'': SSH のサーバ名 (IP アドレス) 
 +      * ''path/to/repository'': サーバ内のパス (''USER_NAME'' が指定されているのであれば、''/home/USER_NAME'' が起点になる) 
 +    * クローン\\ <code bash>$ hg clone ssh://USER_NAME@SERVER_NAME/path/to/repository</code> 
 +      * ''USER_NAME'': SSH のユーザ名 
 +      * ''SERVER_NAME'': SSH のサーバ名 (IP アドレス) 
 +      * ''path/to/repository'': サーバ内のパス (''USER_NAME'' が指定されているのであれば、''/home/USER_NAME'' が起点になる) 
 +    * プル\\ <code bash>$ hg pull ssh://USER_NAME@SERVER_NAME/path/to/repository</code> 
 +      * ''USER_NAME'': SSH のユーザ名 
 +      * ''SERVER_NAME'': SSH のサーバ名 (IP アドレス) 
 +      * ''path/to/repository'': サーバ内のパス (''USER_NAME'' が指定されているのであれば、''/home/USER_NAME'' が起点になる) 
 + 
 +==== リポジトリの root ディレクトリパスを調べる ==== 
 +  * シェルスクリプトなどに使えるかも。\\ <code bash>$ hg root</code> 
 +  * 参考サイト: [[https://superuser.com/questions/41480/getting-parent-repository-path/44381 | mercurial - Getting parent repository path - Super User]]
  
 ===== エクステンション ===== ===== エクステンション =====
行 293: 行 365:
  
   * 詳しくは [[https://www.mercurial-scm.org/wiki/JapaneseUsingExtensions | JapaneseUsingExtensions - Mercurial]]   * 詳しくは [[https://www.mercurial-scm.org/wiki/JapaneseUsingExtensions | JapaneseUsingExtensions - Mercurial]]
 +
 +==== リポジトリを git リポジトリに変換する ====
 +  - 変換プログラムをダウンロードする。\\ <code bash>
 +$ git clone http://repo.or.cz/r/fast-export.git fast-export
 +</code>
 +  - 転送先の git リポジトリ (空) ''NEW_GIT_REPO'' を作成する。\\ <code bash>
 +$ mkdir NEW_GIT_REPO
 +$ cd NEW_GIT_REPO
 +$ git init 
 +</code>
 +  - 変換する。\\ <code bash>
 +$ ../fast-export/hg-fast-export.sh -r HG_REPO_PATH
 +</code>
 +    * ''HG_REPO_PATH'': 変換したい mercurial のリポジトリパス
 +  * 参考サイト: [[http://var.blog.jp/archives/81872068.html | mercurial リポジトリを git に移行する]]
 +
 +
 +===== Tips =====
 +==== 一部のサブコマンドで pager を無効化する ====
 +  * ''hg status'' や ''hg log'' などの結果はデフォルトでは、''less'' コマンド (pager) のように表示される。
 +  * これらの結果をプロンプトに反映させたい場合や、端末上にその結果を残したい (pager は q キーを押すと、結果が消える) 場合は、設定ファイル ''$HOME/.hgrc'' に以下を追記すると良い。\\ <code>
 +[pager]
 +ignore = SUBCOMMAND [, SUBCOMMND, ...]
 +</code>
 +    * ''SUBCOMMAND'': pager を無効化したいサブコマンド (''log'' や ''status'' など hg の後に付けるキーワード)
 +    * 複数ある場合は、カンマで区切る
 +    * 参考サイト: [[https://www.mercurial-scm.org/wiki/PagerExtension | PagerExtension - Mercurial]]
 +  * 一時的に無効化したい場合は、''--pager false'' を各コマンドの後ろにでも付けておけば良い。
 +    * 例:\\ <code>
 +$ hg log --pager false
 +</code>
 +  * 参考サイト: [[https://stackoverflow.com/questions/44894062/disable-color-and-paging-for-mercurial | Disable color and paging for mercurial - Stack Overflow]]
  
 ===== 参考サイト ===== ===== 参考サイト =====
  • ツール/mercurial.1511759076.txt.gz
  • 最終更新: 2017/11/27 14:04
  • by mumeiyamibito