QA@IT

Subversionにおいて、「前回マージした以降に行われたコミットをすべてマージ」を行うには?

3566 PV

gitであれば、

git checkout -b work
git checkout master
(some commits)
git checkout work
git merge master
git checkout master
(some commits)
git checkout work
git merge master

のように繰り返すことで、「前回マージした以降に行われたコミット」だけをマージすることを、繰り返し実行出来ますが、Subversionだと、リビジョンの指定が必須なため、前回マージしたリビジョンを何らかの形で記録しておく必要があります。

svn switch http://repo/branches/work
svn merge -r 10:HEAD http://repo/trunk
svn ci -m ''
svn switch http://repo/trunk
(some commits)
svn switch http://repo/branches/work
svn merge -r (ここの番号を前回の番号から求めないといけない!):HEAD http://repo/trunk

自動テストのため、上記のようなマージをバッチ処理で行おうとしているのですが、リビジョン番号を記録しておく以外の方法で、「前回マージした以降に行われたコミット」だけをマージする方法はありますでしょうか?

  • svkならリビジョン番号なしでマージ(smerge)できるらしいですが、svk覚えるくらいならきっとgit-svn使いますよね…。svkについて私もよくしらないのでコメントで。 -

回答

git-svnを使用して、以下のように操作を行うことで、目的を達成しました。

準備

git svn clone (repository)
git checkout -b work
(some required edits)
git add .;git commit

毎回の操作

git checkout master
git svn rebase
git checkout work
git rebase master

もし、マージ結果を毎回コミットする必要があるなら、準備においてworkブランチを作成する際、

svn cp (repository)/trunk (repository)/branches/work
git svn fetch
git checkout -b work svn/work

とし、毎回の操作の最後に、以下の操作を追加して実行すればよいでしょう。(必要がなかったため、動作は確認していません)

git svn dcommit
編集 履歴 (0)
  • 自己解決ということで自分の回答をaccept願います。 -

svn info コマンドを元に取得すればいいのでは?

$ svn info .
Path: .
Working Copy Root Path: C:\workspace
URL: http://localhost/svn/repos/trunk/
Repository Root: http://localhost/svn/repos/
Repository UUID: *********
Revision: 3682
Node Kind: directory
Schedule: normal
Last Changed Author: alice.asahina
Last Changed Rev: 3682
Last Changed Date: 2013-01-29 15:27:13 +0900 (火, 29 1 2013)
編集 履歴 (1)
  • ブランチの最新revとるならsvn log --stop-on-copyのほうがいいかもしれません。 -
  • HEADじゃなくWORKのリビジョンを取得したいのかと。 -
  • はい、そのつもりですよ。最後の行みればわかったような気がしますが。 -
  • 自分が使用しているsvnクライアントだとそのディレクトリまたはファイルの一番最初のコミットrev.になりますね。 (TortoiseSVN 1.7.12 / SVN 1.7.9 ) -
  • 1行目でした、すいません。switchしたりupもしていれば出ますね(switchしたタイミングで作業ディレクトリのリビジョンは更新されてると思います)。infoだとtrunkや別のブランチが伸びていてもリビジョン変わりますよね?そこが気になったんですが。 -
  • ここの主はどうしたんだろう。・・ -
ウォッチ

この質問への回答やコメントをメールでお知らせします。