やりたいことのまとめ
- Mercurialという古い仕組みで管理しているデータを、Gitという新しい仕組みに移したい。
- いきなり本番環境(会社の重要な場所)でやると失敗した時に困るので、テスト環境を作って移行が本当にできるか試す。
- リモートサーバ(みんなで使うための共有場所)を模擬的に作る。
準備するもの
- 仮想マシン(VM)3台を用意します。
- 1台目: Mercurialサーバ(古い仕組みを模した環境)
- 2台目: Gitサーバ(新しい仕組みを模した環境)
- 3台目: クライアント(自分が操作する場所)
- CentOSを全ての仮想マシンにインストールします。インストール方法は前に説明した通りです。

1台のサーバ上でやると、手間はかかりませんがネットワーク関連の挙動を確認できないので、できるなら3台準備しましょう!
- MercurialサーバがHTTP経由で正しく動作するか
(ブラウザやクライアントツールでアクセス可能か) - GitサーバがSSH経由で正しく接続できるか
(Gitのリモートリポジトリがクライアントからアクセス可能か)
1. Mercurialサーバの作成(古い仕組みの共有場所)
- 仮想マシンにログインしたら、以下のコマンドを順番に入力します。
① Mercurialとウェブサーバの準備をする
# リポジトリの更新:
sudo dnf update -y
# EPELリポジトリの有効化:
sudo dnf install ―y epel-release
# Mercurialのインストール:
sudo dnf install -y mercurial
# Apacheのインストール
sudo dnf install -y httpd

httpd
:httpd
は、Apache HTTP Serverのパッケージ名です。Apacheは、最も一般的に使用されているウェブサーバであり、MercurialリポジトリをHTTP経由で公開するために使用されます。- Mercurialは、HTTP経由でリポジトリを公開するためにApacheと連携することがよくあります。このコマンドは、Apache HTTPサーバもインストールして、ウェブ経由でMercurialリポジトリにアクセスできるように設定するために必要です。
-y オプション
-y
は、インストール中に発生する確認をすべて自動的に「はい」にして進めるオプションです。通常、yum
コマンドを実行すると、インストールを進める前に確認を求められますが、-y
オプションを指定することで、その確認をスキップしてインストールを自動的に進めます。
② Mercurial用のリポジトリ(データの入れ物)を作る
mkdir /var/hg-repo
cd /var/hg-repo
# カレント直下にtest-repoを作成して、それをレポジトリとする
hg init test-repo
③ サンプルデータを作る
以下を一行ずつ入力してください。
cd /var/hg-repo/test-repo
echo "これは最初のファイルです" > file1.txt
hg add file1.txt
hg commit -m "最初のコミット" -u "田中 太郎 <taro@example.com>"
echo "これは2番目のファイルです" > file2.txt
hg add file2.txt
hg commit -m "2つ目のコミット" -u "山田 花子 <hana@example.com>"
④ ウェブサーバを使ってMercurialをみんなが使えるようにする
- 設定ファイルを作ります:
sudo vi /etc/httpd/conf.d/mercurial.conf
- 設定内容を次のように書きます(コピペでもOK)

vimファイルの操作
「iキー」:書き込みモード
「Escキー」:コマンドモード
「:wq」:保存して終了
Alias /hg "/var/hg-repo"
<Directory "/var/hg-repo">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

この設定は、Apache HTTP サーバで Mercurial リポジトリ(またはそのディレクトリ)をウェブ経由でアクセスできるようにするためのものです。具体的には、以下のことを行っています:
1. Alias /hg "/var/hg-repo"
Alias
ディレクティブは、URLのパスと実際のファイルシステムのパスを関連付けます。この行は、ウェブブラウザからのアクセス時に、URLパス/hg
にアクセスすると、実際にはサーバ上のディレクトリ/var/hg-repo
にアクセスされるように設定しています。具体的には:- ユーザーがウェブブラウザで
http://<サーバのIPまたはドメイン>/hg
にアクセスすると、実際にはサーバ内の/var/hg-repo
フォルダが参照されます。
- ユーザーがウェブブラウザで
2. <Directory "/var/hg-repo">
<Directory>
ディレクティブは、指定したディレクトリに対する設定を行います。ここでは、/var/hg-repo
ディレクトリに対する設定を指定しています。このディレクティブ内で行う設定は、そのディレクトリ内のファイルに対して適用されます。
3. Options Indexes FollowSymLinks
Options
ディレクティブは、ディレクトリに対して許可される操作を定義します。Indexes
: ディレクトリにインデックスファイル(例:index.html
)がない場合、そのディレクトリ内のファイル一覧を表示することを許可します。これにより、/var/hg-repo
内にインデックスファイルがない場合でも、ディレクトリ内のファイルがリスト表示されます。FollowSymLinks
: シンボリックリンクをたどることを許可します。これにより、シンボリックリンクがディレクトリ内にあった場合、そのリンク先も正しく処理されます。
4. AllowOverride None
AllowOverride
は、.htaccess
ファイルを使った設定の上書きに関するオプションです。None
:.htaccess
ファイルによる設定の上書きを許可しません。このディレクティブが設定されている場合、/var/hg-repo
ディレクトリ内に.htaccess
ファイルがあっても、設定内容を変更することができません。
5. Require all granted
Require
は、アクセス制御を行うための設定です。all granted
: このディレクティブは、指定されたディレクトリへのアクセスをすべてのユーザーに許可することを意味します。つまり、/var/hg-repo
ディレクトリに対して、インターネット上の誰でもアクセスできるように設定しています。
- サーバを再起動
sudo systemctl restart httpd
⑤ テストする 自分のパソコンのブラウザで次にアクセスします。
http://[MercurialサーバのIP]/hg/test-repo

サーバが自分のコンピュータ(仮想マシンや物理サーバなど)で動作している場合、以下のコマンドで IP アドレスを確認できます。
『ip a』
出力の中で「inet
」という項目を探します。inet
の後に表示されている数字の部分が、そのサーバのIPアドレスです。例えば:
[inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0]
この場合、IPアドレスは 192.168.1.100
です。
2. Gitサーバの作成(新しい仕組みの共有場所)
1. Mercurialサーバと同じように、仮想マシンにログインして以下を実行します。
① Gitの準備をする
sudo dnf update -y
sudo dnf install -y git
② Git用のリポジトリを作る
mkdir /var/git-repo
cd /var/git-repo
git init --bare test-repo.git
③ 他のマシンからアクセスできるようにする(SSHを有効にする)
- SSHを設定します:
sudo vi /etc/ssh/sshd_config
- 次の2行を確認して、必要なら変更します:
PermitRootLogin yes
PasswordAuthentication yes

1. PermitRootLogin yes
この設定は、SSH経由での root アカウントでのログインを許可するかどうか を制御します。
yes
の意味: SSHを使って、rootユーザー(管理者権限を持つユーザー)が直接ログインできるようにする。理由・目的:- 設定の簡便さ: 特に検証環境や一時的な環境では、rootアカウントで直接ログインできるようにすることで作業が簡単になる。
- 管理の迅速性: root権限が必要な作業を行う際、一般ユーザーでログインしてから
sudo
を使う手間が省ける。 - 短期間でのセットアップ: テスト環境では、セキュリティよりもスピードが優先されるため、rootログインを許可することがある。
- 注意点: 本番環境ではセキュリティ上のリスクが高いため、
PermitRootLogin no
に設定するのが一般的です。なぜなら、rootアカウントはハッキング対象になりやすく、強制的なパスワード解析(ブルートフォース攻撃)に対して脆弱になるからです。
2. PasswordAuthentication yes
この設定は、パスワード認証を許可するかどうか を制御します。
yes
の意味: SSH接続時に、パスワードを使った認証を許可する。理由・目的:- 簡単なアクセス: パスワード認証を許可することで、公開鍵認証を設定しなくてもSSH接続が可能になる。
- 検証環境での利用: テストや検証環境では、公開鍵の管理が面倒な場合が多く、シンプルにパスワードだけでログインできるようにしたほうが手軽。
- 注意点: 本番環境では、セキュリティ上の理由からパスワード認証を無効にし、代わりに 公開鍵認証 を利用するのが推奨されます。公開鍵認証を利用すると、パスワードが漏洩するリスクを低減できます。
- サーバを再起動:
sudo systemctl restart sshd
④ テストする 別の仮想マシンから以下を実行して接続できるか確認:
ssh [GitサーバのIP]
3. クライアントの作成(変換ツールを動かす場所)
1. 仮想マシンにログインして、GitとMercurialの両方をインストールします:
sudo dnf update -y
sudo dnf install -y git mercurial
2. 変換ツール(hg-fast-export)を取得します
git clone http://repo.or.cz/r/fast-export.git /tmp/fast-export
4. リポジトリの変換手順
1. Mercurialリポジトリをクローン クライアントから以下を実行します
hg clone http://[MercurialサーバのIP]/hg/test-repo /tmp/hg-repo
2. 作者情報を抽出して整理する
cd /tmp/hg-repo
hg log | grep user: | sort | uniq | sed 's/user: *//' > /tmp/authors
/tmp/authors /tmp/authors
ファイルを編集し、次のように書き直します(例):
田中 太郎 <taro@example.com>=Tanaka Taro <taro@example.com>
山田 花子 <hana@example.com>=Yamada Hanako <hana@example.com>
3. Gitリポジトリを作成して変換する
git init /tmp/converted
cd /tmp/converted
/tmp/fast-export/hg-fast-export.sh -r /tmp/hg-repo -A /tmp/authors
4. 変換後のリポジトリをGitサーバにアップロード
git remote add origin ssh://[GitサーバのIP]/var/git-repo/test-repo.git
git push origin --all
5. 変換が成功したかを確認
1.履歴を確認:
git log
→ Mercurialの履歴がすべて移っていれば成功。
2. ブランチやタグを確認:
git branch -a
git tag
3. 作者情報を確認: 履歴(git log
)を見て、作者名とメールアドレスが正しいかを確認します。