[SVN] Как сделать merge, если поменялась структура

ifani

Что-то никак не соображу, как смерджить изменения из транка, когда в бранче поменялась структура?
Например:
/trunk
/ModuleA
/ModuleB
/ModuleC
/branches
/Branch1
/SomePackage1
/ModuleARenamed
/ModuleB
/SomePackage2
/ModuleC
В моём случае изменения даже всего в одном модуле, но в бранче он теперь в другом месте и плюс переименован (ModuleA из примера поэтому svn ругается, что у меня tree conflict.
Кто-нибудь с таким сталкивался? Как быть в таком случае?
Мне пока на ум приходит только идея перенести нужный мне модуль в бранче на старое место, смерджить с транком и снова перенести обратно. Но я очень надеюсь, что есть какой-то более красивый и правильный способ.
PS:
Кстати, ещё очень интересно, а в распределённых системах контроля версий (git, Hg) с этим проще?

oliver11

Кстати, ещё очень интересно, а в распределённых системах контроля версий (git, Hg) с этим проще?
$ mkdir test
$ cd test
$ git init
Initialized empty Git repository in /home//tmp/test/.git/
$ cat > file.txt
a
b
c
$ git add file.txt
$ git commit -m "Initial commit"
[master (root-commit) 04d8594] Initial commit
1 file changed, 3 insertions(+)
create mode 100644 file.txt
$ git branch feature
$ git checkout feature
Switched to branch 'feature'
$ mkdir somedir
$ git mv file.txt somedir
$ cat >> somedir/file.txt
d
e
f
$ git commit -a -m "Modified file.txt and moved to somedir"
[feature 0103ef2] Modified file.txt and moved to somedir
1 file changed, 3 insertions(+)
rename file.txt => somedir/file.txt (50%)
$ git checkout master
Switched to branch 'master'
$ git merge feature
Updating 04d8594..0103ef2
Fast-forward
file.txt => somedir/file.txt | 3 +++
1 file changed, 3 insertions(+)
rename file.txt => somedir/file.txt (50%)
$ cat somedir/file.txt
a
b
c
d
e
f

procenkotanya

Не, твой сценарий проще, чем у топикстартера: он мёрджит trunk->feature, причём в транке файл лежит в старом месте.

katrin2201

git pull --rebase

oliver11

Да, ты прав. Тогда так:
$ git init
Initialized empty Git repository in /home//tmp/test/.git/
$ cat > file.txt
1
2
3
$ git add file.txt
$ git commit -m "Initial commit"
[master (root-commit) 9e37db9] Initial commit
1 file changed, 3 insertions(+)
create mode 100644 file.txt
$ git branch feature
$ cat >> file.txt
q
w
e
$ git add file.txt
$ git commit -m "Changed file"
[master 34c992e] Changed file
1 file changed, 3 insertions(+)
$ git checkout feature
Switched to branch 'feature'
$ mkdir somedir
$ git mv file.txt somedir/
$ git commit -m "Moved file to somedir"
[feature bacddb4] Moved file to somedir
1 file changed, 0 insertions(+ 0 deletions(-)
rename file.txt => somedir/file.txt (100%)
$ git merge master -m "Do merge"
Auto-merging somedir/file.txt
Merge made by the 'recursive' strategy.
somedir/file.txt | 3 +++
1 file changed, 3 insertions(+)
$ cat somedir/file.txt
1
2
3
q
w
e

oliver11

Но я очень надеюсь, что есть какой-то более красивый и правильный способ.
Можно попробовать сделать
git svn clone --stdlayout svn://server/repo
cd repo
git checkout Branch1
git merge master
git svn dcommit

erotic

Какие-то у тебя ненастоящие примеры - то мерджишься от потомка, получая прямой fast-forward, то мерджишься от предка, получая тоже что-то бессодержательное.

erotic

Короче да, другие СКВ это умеют.

swift /tmp/1 $ git init
Initialized empty Git repository in /tmp/1/.git/
swift /tmp/1 $ cat > file
1
2
3
swift /tmp/1 $ git add file
swift /tmp/1 $ git commit -m initial
[master (root-commit) 9c4d4c5] initial
1 files changed, 3 insertions(+ 0 deletions(-)
create mode 100644 file
swift /tmp/1 $ git checkout -b bbb
Switched to a new branch 'bbb'
swift /tmp/1 $ head -n 2 file > 1
swift /tmp/1 $ mv 1 file
swift /tmp/1 $ git commit -a -m "removed last line"
[bbb 333042a] removed last line
1 files changed, 0 insertions(+ 1 deletions(-)
swift /tmp/1 $ mkdir dir
swift /tmp/1 $ git mv file dir/
swift /tmp/1 $ git commit -m moved
[bbb 575034c] moved
1 files changed, 0 insertions(+ 0 deletions(-)
rename file => dir/file (100%)
swift /tmp/1 $ git checkout master
Switched to branch 'master'
swift /tmp/1 $ tail -n 2 file > 1
swift /tmp/1 $ mv 1 file
swift /tmp/1 $ cat file
2
3
swift /tmp/1 $ git commit -a -m "removed first line"
[master ece9def] removed first line
1 files changed, 0 insertions(+ 1 deletions(-)
swift /tmp/1 $ git checkout bbb
Switched to branch 'bbb'
swift /tmp/1 $ git merge master
Auto-merging dir/file
Merge made by the 'recursive' strategy.
dir/file | 1 -
1 files changed, 0 insertions(+ 1 deletions(-)
swift /tmp/1 $ cat dir/file
2

SPARTAK3959

Делаешь обычный мерж, игнорируешь конфликт, затем мержишь A в ModuleARenamed.

SPARTAK3959

Просто у svn'a нет команды move. Если в git'e сделать add + delete (например если файлы перенесены с помощью eclipse без git-плагина при рефакторинге) будет такая же проблема.

Phoenix

Просто у svn'a нет команды move

можно поподробнее, что имелось ввиду. "svn move" есть же.

doublemother

можно поподробнее, что имелось ввиду. "svn move" есть же.
$ svn help move|head -n7|tail -n1
Note: this subcommand is equivalent to a 'copy' and 'delete'.
$ svn --version|head -n1
svn, version 1.7.3 (r1242825)

Phoenix

А, да, бесит это.
А почему svn это не умеет, кстати? Там какие-то фундаментальные ограничения?

Bayur19

А, да, бесит это.
А почему svn это не умеет, кстати? Там какие-то фундаментальные ограничения?
Обещают в 1.8
http://subversion.tigris.org/issues/show_bug.cgi?id=3631
http://subversion.apache.org/roadmap.html
Оставить комментарий
Имя или ник:
Комментарий: