« ^ »

10年前の自分と合流する

所要時間: 約 5分

だいぶ前になるがBitBucketがMercurialのサポートを終了した。そんな事は完全に忘れていて、特に必要なリポジトリも無いことから放置していたが、ひょんなことから状態を確認する機会を得た。以前Mercurialで管理していたリポジトリへはアクセスできなくなっていたが、アーカイブファイルへのアクセスはまだ残っていた。折角なのでそれらをMercurialからGitに移行し、履歴を取り込むことにする。

アーカイブプロジェクトのダウンロード

https://bitbucket-archive.softwareheritage.org/projectsにアーカイブされたプロジェクトを所有するユーザーを辿れる。ここからアーカイブ済みプロジェクトを辿ってダウンロードした。今回は以下のリポジトリが取り込む対象となる。それぞれのアーカイブからtarballをダウンロードした。またissue等の情報はもう忘れる事にする。

  • barjohn
  • dqn
  • excellib
  • excelrescue
  • ftptools
  • guippy
  • instant
  • issues
  • myansible
  • perforcelib
  • samples
  • sk8depstore
  • sphinxcontrib-dqndomain
  • sphinxtheme-oldschool
  • tweepy-doc-ja

MercurialからGitへの変換ツールをダウンロードする

次に、変換ツールをダウンロードする。

git clone --depth 1 http://repo.or.cz/r/fast-export.git

またスクリプトを実行するためパスを通しておく。またMercurialをHomebrewでインストールしている場合などで、Mercurialが使用するPythonを見付けられないような構成の場合、PYTHON環境変数にMercurialが使用するPythonへのパスを設定する。

export PATH=$PATH:/opt/ng/fast-export
export PYTHON=/usr/local/opt/[email protected]/bin/python3.11
パスを通す例 (パスは環境により異なる)

名寄せファイルを作成する

それぞれのtarballを解凍し、名寄せ用のファイルを生成する。

hg log | grep user: | sort | uniq | sed 's/user: *//' >> ../authors

名寄せ用のファイルを編集した。確認したら懐しい名前を見付けた。ここでは名前は伏せておく。初めてパッチを貰った人や、以前交流のあった人の履歴が残っていたのを見付けて、少し感慨深い気持になった。削除しないでよかったと思った。

変換後Gitリポジトリを初期化する

変換後のGitリポジトリを初期化しておく。

git init 0453dd11-c203-4e42-8d99-33bd2f92c2b9-repo-git
git init 0b7429c7-22a0-476e-b2fe-51e917d732a8-repo-git
git init 2fb4d9f4-7083-443f-814b-ab45c9ab4f4e-repo-git
git init 3da41aba-5bee-496a-a7e5-5280b5150944-repo-git
git init 40fcca72-9204-4c1c-bdca-2a01746e89a9-repo-git
git init 5bd3241a-d312-44a7-ab4c-2d559d990d40-repo-git
git init 7b8f2df6-6a2b-455b-aa69-d76fce0d1f40-repo-git
git init 7c066f9e-f0fe-42d4-a0f8-58cf8154dcc6-repo-git
git init 910afa7e-34ab-476d-bd5d-bac89bafe3bb-repo-git

MerucialからGitへの変換する

カレントディレクトリを変換後のGitディレクトリに移動し、hg-fast-export.shを実行する。 -r オプションで変換元のMercurialリポジトリのパスをしていする。また -A で名寄せファイルのパスを指定する。

  • hg-fast-export.sh -r opt/ng/bitbucket-archive/0453dd11-c203-4e42-8d99-33bd2f92c2b9-repo –force -A /opt/ng/bitbucket-archive/authors
  • hg-fast-export.sh -r opt/ng/bitbucket-archive/0b7429c7-22a0-476e-b2fe-51e917d732a8-repo –force -A /opt/ng/bitbucket-archive/authors
  • hg-fast-export.sh -r opt/ng/bitbucket-archive/2fb4d9f4-7083-443f-814b-ab45c9ab4f4e-repo –force -A /opt/ng/bitbucket-archive/authors
  • hg-fast-export.sh -r opt/ng/bitbucket-archive/3da41aba-5bee-496a-a7e5-5280b5150944-repo –force -A /opt/ng/bitbucket-archive/authors
  • hg-fast-export.sh -r opt/ng/bitbucket-archive/40fcca72-9204-4c1c-bdca-2a01746e89a9-repo –force -A /opt/ng/bitbucket-archive/authors
  • hg-fast-export.sh -r opt/ng/bitbucket-archive/5bd3241a-d312-44a7-ab4c-2d559d990d40-repo –force -A /opt/ng/bitbucket-archive/authors
  • hg-fast-export.sh -r opt/ng/bitbucket-archive/7b8f2df6-6a2b-455b-aa69-d76fce0d1f40-repo –force -A /opt/ng/bitbucket-archive/authors
  • hg-fast-export.sh -r opt/ng/bitbucket-archive/7c066f9e-f0fe-42d4-a0f8-58cf8154dcc6-repo –force -A /opt/ng/bitbucket-archive/authors
  • hg-fast-export.sh -r opt/ng/bitbucket-archive/910afa7e-34ab-476d-bd5d-bac89bafe3bb-repo –force -A /opt/ng/bitbucket-archive/authors

名寄せしなおす

-A で名寄せを行ったが確認したところ上手く名寄せできていないことがわかった。もうGitリポジトに変換されているため git filter-branch を使用して以下のようなコマンドで、名寄せを行うことにした。

git filter-branch --env-filter '

NAME_LIST=$(cat <<EOF
名寄せしたい名前1
名寄せしたい名前2
名寄せしたい名前3
EOF
	 )
		
if echo ${NAME_LIST} | grep -qn "${GIT_AUTHOR_NAME}"
then
    export GIT_AUTHOR_NAME="変更後の名前"
    export GIT_AUTHOR_EMAIL="変更後のメールアドレス"
    export GIT_COMMITTER_NAME="変更後の名前"
    export GIT_COMMITTER_EMAIL="変更後のメールアドレス"
fi
'

サブツリーとして取り込む

後はサブツリーとして各種リポジトリを取り込む。初めて知ったのだが、Gitのリモートリポジトリにはローカルのファイルシステムに存在するリポジトリを直接指定できる。

  • git subtree add –prefix=0453dd11-c203-4e42-8d99-33bd2f92c2b9-repo-git 0453dd11-c203-4e42-8d99-33bd2f92c2b9-repo-git master
  • git subtree add –prefix=0b7429c7-22a0-476e-b2fe-51e917d732a8-repo-git 0b7429c7-22a0-476e-b2fe-51e917d732a8-repo-git master
  • git subtree add –prefix=2fb4d9f4-7083-443f-814b-ab45c9ab4f4e-repo-git 2fb4d9f4-7083-443f-814b-ab45c9ab4f4e-repo-git master
  • git subtree add –prefix=3da41aba-5bee-496a-a7e5-5280b5150944-repo-git 3da41aba-5bee-496a-a7e5-5280b5150944-repo-git master
  • git subtree add –prefix=40fcca72-9204-4c1c-bdca-2a01746e89a9-repo-git 40fcca72-9204-4c1c-bdca-2a01746e89a9-repo-git master
  • git subtree add –prefix=5bd3241a-d312-44a7-ab4c-2d559d990d40-repo-git 5bd3241a-d312-44a7-ab4c-2d559d990d40-repo-git master
  • git subtree add –prefix=7b8f2df6-6a2b-455b-aa69-d76fce0d1f40-repo-git 7b8f2df6-6a2b-455b-aa69-d76fce0d1f40-repo-git master
  • git subtree add –prefix=7c066f9e-f0fe-42d4-a0f8-58cf8154dcc6-repo-git 7c066f9e-f0fe-42d4-a0f8-58cf8154dcc6-repo-git master
  • git subtree add –prefix=910afa7e-34ab-476d-bd5d-bac89bafe3bb-repo-git 910afa7e-34ab-476d-bd5d-bac89bafe3bb-repo-git master

まとめ

BitBucketでホスティングしていたMercurialのプロジェクトをGitに変換し、履歴を取り込んだ。履歴には2012年(現時点で10年前)のものもあった。また懐しい人からのコミットもあった。10年前の自分とようやく合流できた気がする。自分や周りに何気なく存在する歴史を大切にしていこうと思った。