Ответвление от ветки: переход к обычной ветке

#svn #branch

#svn #ветка

Вопрос:

Обычно я создаю ответвления из магистрали, работаю над ними и в конечном итоге реинтегрирую их обратно в магистраль.

Иногда я создаю ветку Y из другой ветки X, чтобы я мог начать с кода X. Обычно я сначала реинтегрирую Y в X, затем реинтегрирую X в магистраль.

 Y --> X --> trunk
  

Но что, если я хочу сначала реинтегрировать X в магистраль, и я больше не хочу, чтобы Y зависел от X? Другими словами, я хочу, чтобы Y был обычной веткой, чтобы я мог объединить ее напрямую в магистраль и из нее, не проходя через X.

 Y --> trunk
X --> trunk
  

Что мне делать? Одним из подходов было бы создать новую ветку и объединить в нее все изменения Y. Но я хотел бы продолжать использовать Y, если это возможно, чтобы не потерять его историю. Возможно ли это?

Ответ №1:

Subversion не отслеживает никаких зависимостей между ветвями. Он сохраняет только историю и предысторию слияний.

При слиянии Y с X svn вставляет информацию о только что произошедшем слиянии. Когда вы объединяете X обратно в магистраль, эта информация передается в магистраль. Таким образом, изменение никогда не будет применено дважды при последующих слияниях. Независимо от того, как были выполнены эти слияния.

Вы должны просто объединить X в trunk, а затем работать с Y, как будто X никогда не существовало. Объединитесь в магистраль, если хотите, или просто продолжайте работать над этим, хотите ли вы.

В svn ветви не имеют зависимостей или чего-либо еще.

Комментарии:

1. Но при слиянии уделяется внимание общему предку. Итак, найдет ли он правильного общего предка, если я объединю trunk в Y (или наоборот)? Похоже, что, по крайней мере, если я реинтегрирую X в trunk, мне нужно будет заблокировать эту ревизию из Y.

2. В тот момент, когда вы ответвляли Y от X, Y в последний раз получал какие-либо изменения от X. На Y больше не влияют никакие действия, выполняемые на X. Будь то слияние, перемещение или удаление.

3. Просто чтобы уточнить, я объединял X в Y. Таким образом, любые изменения, которые были в X, также есть в Y. Следовательно, если я реинтегрирую X в магистраль, это продублирует эти изменения в магистрали. Итак, я думаю, мне нужно заблокировать объединение этой ревизии обратно в Y.

4. Информация о слиянии хранится в свойстве svn «svn:mergeinfo» в целевой ветке. В вашем случае информация о слиянии будет храниться как в Y, так и в trunk. Поэтому, когда вы объедините Y в trunk, svn обнаружит это и объединит соответствующим образом.

5. Хорошо, я попробовал это, и это сработало. После того, как я реинтегрировал X в магистраль, я выполнил слияние только для записей из магистрали в X, чтобы заблокировать повторное объединение этой ревизии. Затем я объединил X в Y, и заблокированная ревизия теперь также заблокирована из Y. Теперь я могу слиться из trunk в Y и реинтегрироваться из Y в trunk.