Subversion ブランチからコードをマージしているときに、理解できないものがあります。
一部の機能の修正を実装した「実験的」ブランチがあります。ブランチの作業を開始しました:
svn cp https://..../trunk https://.../branches/experimental
過去 2 週間、実験的なブランチのハッキングを進めましたが、トランクでは通常どおりの開発が行われました。ブランチでの作業は、特定の「ルート」フォルダー (usermngmt-II) でのみ行われました。
ここで、ブランチの作業をトランクにマージします。マージ中に発生する問題は、次のように説明できます。
トランクのバージョンのフォルダーをミラーリングする作業フォルダーから開始します...
$ cd workOnTrunk
$ svn info
Path: .
URL: https://x.x.x.x/.../trunk/usermgmnt-II
...
$ svn update
At revision 4900.
$ svn status
$
...マージ コマンドを実行します。
$ svn merge --reintegrate ^/branches/experimental/usermgmnt-II/
Conflict discovered in 'webservices/usermngmt-ws-api/src/java/gr.neuropublic.gaia.usermngmt.ws.api/IUserMngmtService.java'.
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options: df
--- /tmp/svn-9vbG0j Πεμ Απρ 11 11:27:54 2013
+++ webservices/usermngmt-ws-api/src/java/gr.neuropublic.gaia.usermngmt.ws.api/.svn/tmp/IUserMngmtService.java.8.tmp Πεμ Απρ 11 11:27:54 2013
@@ -49,7 +49,16 @@
public Pair<Integer, String> numOfUsers();
+<<<<<<< .working
+ public Pair<List<Map<String, String>>, String> allSubsInfo();
+=======
+>>>>>>> .merge-right.r4900
+ public Pair<List<Map<String, String>>, String> allGaiaSubsInfo();
+
+ public Pair<List<Map<String, String>>, String> subsUsersInfo(int subs_id);
+
+
@Local
そのため、subversion は、「作業中」のバージョン、つまり、作業フォルダー内のバージョン (上記で見たように、「トランク」をミラー化したもの) に次の行があると報告しています...
public Pair<List<Map<String, String>>, String> allSubsInfo();
...その中に、実験的なブランチのバージョン(マージ競合メッセージを正しく解読している場合)が、Subversionによって(a)「allSubsInfo」行が配置されておらず、(b)他に2つあると報告されている代わりは:
public Pair<List<Map<String, String>>, String> allGaiaSubsInfo();
public Pair<List<Map<String, String>>, String> subsUsersInfo(int subs_id);
しかし、これは事実ではありません - それを証明するために、"svn cat" を使用して実験的ブランチのファイルの内容を出力し、報告されたメソッドに対して grep を使用します:
$ svn cat ^/branches/experimental/usermgmnt-II/webservices/usermngmt-ws-api/src/java/gr.neuropublic.gaia.usermngmt.ws.api/IUserMngmtService.java | grep 'all.*SubsInfo'
$
「実験的」ブランチの形式の「競合」ファイルには、「allSubsInfo」または「allGaiaSubsInfo」のインスタンスがないことは明らかです。実際、「svn merge」コマンドで生成された出力ファイルは...
$ grep allSubsInfo IUserMngmtService.java.merge-right.r4900
$
...そうでもない。実際、単純に 2 つのバージョンのファイルを抽出すると、次のようになります。
$ svn cat -r4900 ^/branches/experimental/usermgmnt-II/webservices/usermngmt-ws-api/src/java/gr.neuropublic.gaia.usermngmt.ws.api/IUserMngmtService.java > /var/tmp/experimental.java
$ svn cat ^/trunk/usermgmnt-II/webservices/usermngmt-ws-api/src/java/gr.neuropublic.gaia.usermngmt.ws.api/IUserMngmtService.java > /var/tmp/trunk.java
$ diff -u /var/tmp/experimental.java /var/tmp/trunk.java
--- /var/tmp/experimental.java 2013-04-11 11:49:13.000000000 +0300
+++ /var/tmp/trunk.java 2013-04-11 11:49:58.000000000 +0300
@@ -49,6 +49,13 @@
public Pair<Integer, String> numOfUsers();
+ public Pair<List<Map<String, String>>, String> allSubsInfo();
+
+ public Pair<List<Map<String, String>>, String> allGaiaSubsInfo();
+
+ public Pair<List<Map<String, String>>, String> subsUsersInfo(int subs_id);
+
+
@Local
public interface ILocal extends IUserMngmtService {}
...トランクのバージョンは 3 行だけ追加されていることがわかります。したがって、「マージ」プロセスは、実験的ブランチのこのファイルのバージョンに関する限り、「ノーオペレーション」である必要があります-「実験的ブランチのこのファイルには何もコミットされていません。そのままにしておいてください」。
ヘルプ/提案をお寄せいただきありがとうございます。
PS 重要な場合、Subversion 1.6 を使用しています。具体的には、サーバーではバージョン 1.6.11、クライアント マシンではコマンド ライン インターフェイスのバージョン 1.6.17 を使用しています。問題のある動作は、最新の TortoiseSVN を使用した場合にも見られます (そのため、これがバージョン固有であるとは思えません)。