Mercurial で大いにハマる

社内 Django 勉強会で hdknr さんと投票システムを作りながら勉強しています。Mercurial というバージョン管理システムでリポジトリを管理しているのですが、コミットする際に混乱した話を記します。

Mercurial は分散管理なのでリポジトリは公開リポジトリとローカルリポジトリがあります。私の commit を公開リポジトリに push しようとしたら

ssk@debonvm01 tohyo $ hg push
Enter passphrase for key ‘/home/ssk/.ssh/id_rsa’:
pushing to ssh://hg@bitbucket.org/hdknr/tohyo/
searching for changes
abort: push creates new remote heads!
(did you forget to merge? use push -f to force)

と言われました。merge か強制的に push しろとのことです。hdknr さんのリビジョン持ってないからだな、と思ったので pull して update すればいいんだな、と思ったので実行。

ssk@debonvm01 tohyo $ hg pull
Enter passphrase for key ‘/home/ssk/.ssh/id_rsa’:
pulling from ssh://hg@bitbucket.org/hdknr/tohyo/
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 3 changes to 4 files (+1 heads)
(run ‘hg heads’ to see heads, ‘hg merge’ to merge)
ssk@debonvm01 tohyo $ hg update
abort: crosses branches (use ‘hg merge’ or ‘hg update -C’)

ああ、merge するか -C つけて update しなさい、とのこと。では merge しましょう。

ssk@debonvm01 tohyo $ hg merge
abort: repo has 3 heads – please merge with an explicit rev

んん? 見たこと無いメッセージでした。 head が3つあります。 merge する際は明示的にリビジョンを指定しなさい、とのこと。まずは head を確認します。

ssk@debonvm01 tohyo $ hg heads
changeset: 32:aba5296ed68f
tag: tip
user: naoto
date: Sat Mar 21 16:57:22 2009 +0900
summary: added Tag table in microblog/models.py. added Tags editor in admin site. #29

changeset: 30:6603fe6fa57b
user: naoto
date: Sat Mar 21 16:50:32 2009 +0900
summary: added tags editor in admin. related #29 .

changeset: 15:394bfbc17e5c
user: ssk
date: Tue Mar 10 03:02:58 2009 +0900
summary: added username line in .hgrc

確かに3つあります。最新のリビジョン 32 にしたいので明示的に merge してみます。

ssk@debonvm01 tohyo $ hg merge -r 32
abort: can’t merge with ancestor

失敗します。今度はリビジョンを 30 にします。

ssk@debonvm01 tohyo $ hg merge -r 30
merging trunk/tohyo/microblog/admin.py
merge: warning: conflicts during merge
merging trunk/tohyo/microblog/admin.py failed!
0 files updated, 0 files merged, 0 files removed, 1 files unresolved
There are unresolved merges, you can redo the full merge using:
hg update -C 32
hg merge 30

またもやエラー。今度はこのコマンド打ちなさいと言われたのでやってみます。

ssk@debonvm01 tohyo $ hg merge 30
abort: outstanding uncommitted merges

またもや失敗。どうすれば……。
いったん head を確認してみます。

ssk@debonvm01 tohyo $ hg heads
changeset: 31:74a91ce0a085
tag: tip
parent: 28:cfe09cdb9e4a
user: hdknr
date: Sat Mar 21 16:09:32 2009 +0900
summary: re-created database and syncdb after addring Tag model which ManyToMany to Note

changeset: 30:6603fe6fa57b
user: naoto
date: Sat Mar 21 16:50:32 2009 +0900
summary: added tags editor in admin. related #29 .

changeset: 15:394bfbc17e5c
user: ssk
date: Tue Mar 10 03:02:58 2009 +0900
summary: added username line in .hgrc

リビジョン 32 が消えています。状況に変化がありましたが後退している気がします。
pull してリビジョン32を改めて持ってきます。

ssk@debonvm01 tohyo $ hg pull
Enter passphrase for key ‘/home/ssk/.ssh/id_rsa’:
pulling from ssh://hg@bitbucket.org/hdknr/tohyo/
searching for changes
no changes found

32 が落ちてきません。これでなんだか分からなくなりました。
ここで一気にごちゃごちゃ打ち込んでみることにしました。

ssk@debonvm01 tohyo $ hg merge
abort: repo has 3 heads – please merge with an explicit rev
ssk@debonvm01 tohyo $ hg merge 30
abort: outstanding uncommitted changes
ssk@debonvm01 tohyo $ hg merge 31
abort: can’t merge with ancestor
ssk@debonvm01 tohyo $ hg merge -r 31
abort: can’t merge with ancestor
ssk@debonvm01 tohyo $ hg update -C 31
2 files updated, 0 files merged, 0 files removed, 0 files unresolved

リビジョン 31 は成功した模様。31 は自分のコミット分なのでローカルリポジトリから持ってきたことになります。
mercurial の本を見ていたら resolve コマンドで複数 head を状態を解消できるようなことが書いてあったので試してみます。

ssk@debonvm01 tohyo $ hg resolve -l
hg: unknown command ‘resolve’
Mercurial Distributed SCM

basic commands:

add add the specified files on the next commit
annotate show changeset information per file line
clone make a copy of an existing repository
commit commit the specified files or all outstanding changes
diff diff repository (or selected files)
export dump the header and diffs for one or more changesets
imerge interactive merge
init create a new repository in the given directory
inserve start an inotify server for this repository
log show revision history of entire repository or files
merge merge working directory with another revision
parents show the parents of the working dir or revision
pull pull changes from the specified source
push push changes to the specified destination
qdiff diff of the current patch and subsequent modifications
qimport import a patch
qinit init a new queue repository
qpop pop the current patch off the stack
qpush push the next patch onto the stack
qrefresh update the current patch
remove remove the specified files on the next commit
serve export the repository via HTTP
status show changed files in the working directory
strip strip a revision and all later revs on the same branch
update update working directory

use “hg help” for the full list of commands or “hg -v” for details

resolve コマンドなんてない、と言われました。バージョンを確認してみます。

ssk@debonvm01 tohyo $ dpkg -l |grep mercurial
ii mercurial 1.0.1-5.1 Scalable distributed version control system
ii mercurial-common 1.0.1-5.1 Scalable distributed version control system (Common files)

Debian Lenny の mercurial は 1.0.1 なのでした。resolove は 1.1 からの機能です。これで落胆します。

その後 これまで打ち込んだコマンドを途方にくれながら繰り返しましたが変化なし(pull,merge,head)。
push したいディレクトリを ls してみました。

ssk@debonvm01 tohyo $ ls microblog/
__init__.py admin.py.orig backends.pyc mails.py models.pyc views.py
__init__.pyc admin.pyc forms.py mails.pyc urls.py views.pyc
admin.py backends.py forms.pyc models.py urls.pyc

admin.py.orig という .orig のついたファイルがあります。merge する際のファイルですね。これがあるからかな、と思い手動でコピーします。ついでに merge。

ssk@debonvm01 tohyo $ mv microblog/admin.py.orig microblog/admin.py
ssk@debonvm01 tohyo $ hg merge
abort: repo has 3 heads – please merge with an explicit rev
ssk@debonvm01 tohyo $ hg merge -r 31
abort: outstanding uncommitted merges

やっぱり変化ないですね。最初の頃から push してないから commit して push してみようかな、とエラー覚悟でやってみました。

ssk@debonvm01 tohyo $ hg ci -m “added Tag table in microblog/models.py. added editor for Tag in microblog/admin.py. #29”
ssk@debonvm01 tohyo $ hg push
Enter passphrase for key ‘/home/ssk/.ssh/id_rsa’:
pushing to ssh://hg@bitbucket.org/hdknr/tohyo/
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 3 changesets with 4 changes to 2 files
remote: bb/acl: naoto is allowed. accepted payload.
remote: quota: 595.4 KB in use, 150.0 MB available (0.39% used)

あれ、できた。head も確認します。

ssk@debonvm01 tohyo $ hg heads
changeset: 32:011ae90a4b6d
tag: tip
parent: 31:74a91ce0a085
parent: 15:394bfbc17e5c
user: naoto
date: Sat Mar 21 17:31:01 2009 +0900
summary: added Tag table in microblog/models.py. added editor for Tag in microblog/admin.py. #29

changeset: 30:6603fe6fa57b
user: naoto
date: Sat Mar 21 16:50:32 2009 +0900
summary: added tags editor in admin. related #29 .

head も2つになっています。
結局何が push できなかった原因かは分からず。ただ、これまで pull したあとは merge しないで update ばかりしていたので複数 head になってしまった気がします。pull したら merge する癖をつければこんなことにはならなかったかもしれません。

pull したら merge しましょう。

Comments are closed.