Svnmerge действительно помогает мне? - PullRequest
3 голосов
/ 18 сентября 2010

Этот пост может быть немного длинным, но если вы думаете, что можете помочь, пожалуйста, прочитайте его, потому что в буквальном смысле это будет спасатель.

Вот сценарий.Я работаю над проектом [для KDE], в котором размещен ствол, скажем: http://ubersvn.org/home/uber/trunk/myapp. Также я работаю над веткой, скажем: http://ubersvn.org/home/uber/branches/work/myapp-mod. Это то, что я 'я делал:

После создания ветви я работал над своей локальной рабочей копией ветви и часто использовал для извлечения изменений из ствола.Мне сказали, что это поможет в предотвращении множества конфликтов, когда дело доходит до окончательного объединения в магистраль.Итак, довольно часто я делал:

svnmerge.py merge
svn commit -F svnmerge-commit-message.txt

После того, как работа была закончена, пришло время объединить ветвь с магистралью.Сначала я проверил рабочую копию ствола:

svn co svn+ssh://ubersvn.org/home/uber/trunk/myapp
cd myapp

Затем я следовал документации 1016 * для слияния назад:

svnmerge init svn+ssh://ubersvn.org/home/uber/branches/work/myapp-mod

И для слияния назад идалее:

svnmerge merge --bidirectional -S svn+ssh://ubersvn.org/home/uber/branches/work/myapp-mod

И вот тут начинается проблема. Во-первых, , судя по всему, он объединяет каждую ревизию с тех пор, как я разветвился.Если он делает это, я не вижу смысла в том, чтобы я часто вытаскивал из ствола и постоянно обновлял свою ветку.Тем не менее, я просто предполагаю, что svnmerge каким-то образом использует его для разрешения конфликтов во время слияния.Пока все хорошо.

Во-вторых, внезапно закончилось с ошибкой, которая звучала что-то вроде:

Attempt to add tree conflict that already exists

Небольшой поиск в Интернетесказал мне, что проблема может быть решена следующим образом:

svn resolve --accept working -R .

И тогда это показывает, что некоторые разрешения были очищены и все.Тем не менее, теперь, когда я делаю это:

svnmerge merge --bidirectional -S [BRANCH_URL]

, он говорит: «Информация svnmerge не найдена».Я попытался использовать svnmerge init BRANCH_URL, но он говорит, что '.' has local modifications. It must be clean.

Итак, теперь я сталкиваюсь с проблемами:

  • Я не могу вытащить из своей ветки, так как есть локальныеИзменения
  • Чтобы очистить мою рабочую копию, я должен выполнить коммит, что не вариант, так как слияние происходит только наполовину, и это определенно сломало бы ствол.
  • Мои файлы полностью несовместимы.Я не знаю, как были объединены ревизии, есть файлы, которые включают в себя «mylittleapp.h», но «mylittleapp.h» был создан в более поздней ревизии.
  • ** Существует огромное количество конфликтов** для ** КАЖДОГО ** нового файла, который был добавлен в мою ветку.Я ** абсолютно ** не понимаю этого.Я был ЕДИНСТВЕННЫМ разработчиком, работавшим над этими файлами, эти файлы не могли быть в багажнике в любой момент времени.Почему в этих файлах так много конфликтов?
  • Существует огромное количество файлов с именами `mybigapp.h.merge- (справа | слева) .r [0-9] +` и `mybigapp.h.working`.`mybigapp.h` сам по себе полон конфликтов.Так много конфликтов, что по-человечески невозможно разрешить.
  • Поскольку половина файлов предполагает наличие файла, которого на самом деле нет, я не могу проверить или сделать что-либо, пока не получу файл.И я просто не могу получить какие-либо более поздние ревизии после ошибки «попытка добавить конфликт дерева».

Итак, как мне продолжить отсюда?Похоже, одно решение состоит в том, чтобы просто отличиться от ветви, применить к стволу и затем зафиксировать.Но в соответствии с политикой организации, в которой я работаю, это не приемлемо.Любая помощь очень ценится, и я был бы очень благодарен.

Спасибо, Рохан

1 Ответ

2 голосов
/ 18 сентября 2010

У меня нет для вас решения, но я надеюсь, что это поможет.

Перед слиянием вашей ветви обратно в транк вашей ветви необходимо иметь каждый коммит из транка с момента создания вашей ветви. Это важно, потому что в противном случае объединение ваших изменений обратно в ствол приведет к удалению изменений других людей из ствола.

rev 5: created my-branch
rev 6: change 1 in my-branch
rev 7: change somefile.h in trunk
rev 8: change 2 in my-branch

Теперь, если вы просто объедините мою ветку с магистралью, изменение с версии 7 будет потеряно! Вот почему вам нужно обновить ветку с всеми изменениями из ствола. Всякий раз, когда вы вносите изменения, SVN добавляет свойство mergeinfo (SVN 1.5) в каталог верхнего уровня (тот, на котором вы выполняете слияние). Это выглядит примерно так:

svn: mergeinfo / trunk: 7, 10-13, 14 (это означает, что вы слили эти ревизии из транка в вашу ветку)

Сообщение о конфликте деревьев обычно связано с перемещением и переименованием файлов и каталогов. Если вы удалили файл, но не использовали svn delete, или файл somefile.h был изменен в транке, но этот файл перемещен в другое место вашей ветви.

Вот что я бы попробовал:

  1. Оформить заказ на новый багажник
  2. Оформить заказ на новую ветку
  3. Убедитесь, что ветвь содержит каждое изменение из транка (вы можете проверить свойство mergeinfo в директории ветки верхнего уровня, если вы используете svn 1.5)
  4. Узнайте все о слиянии http://svnbook.red -bean.com / ru / 1.5 / index.html (это не займет у вас много времени, и вы точно будете знать, что делаете)
  5. Попробуйте объединить вашу ветку с магистралью

Я не могу помочь вам с командной строкой, так как я не использую клиент командной строки. То, что вы пытаетесь сделать, это то, что люди, использующие SVN, делают каждый день, это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...