Как правильно разветвлять post-commit и вернуть транк в SVN? - PullRequest
9 голосов
/ 29 сентября 2008

У меня есть некоторые коммиты, которые я решил, что после этого будет больше ветки, чем транка. Как мне создать ветку и перевернуть ствол, при этом гарантируя, что объединение не будет болезненным позже?

Это так же просто, как скопировать текущую магистраль в ветвь и отменить магистраль? Или это создаст головную боль позже?

Ответы [ 4 ]

18 голосов
/ 29 сентября 2008

Я думаю, что метод Philips будет примерно таким, если предположить, что последняя «хорошая» ревизия была на 100, а вы сейчас на 130, чтобы создать новую ветку:

svn copy -r100 svn://repos/trunk svn://repos/branches/newbranch
svn merge -r 100:130 svn://repos/trunk svn://repos/branches/newbranch

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

Чтобы вернуть багажник:

svn merge -r130:100 .
svn ci -m 'reverting to r100 (undoing changes in r100-130)' . 

(Неважно, в каком порядке вы их выполнили, так что вы могли бы перевернуть ствол перед созданием ветви.)

Тогда вы можете переключиться на новую ветку, которую вы создали в репо:

svn switch svn://repos/branches/newbranch workdir
3 голосов
/ 29 сентября 2008

Если честно, я копирую свои изменения, возвращаю транк, ветвь, затем фиксирую свои изменения в ветке. Основная причина заключается в простоте слияния позже (если вы позже слитеесь из магистрали в ветвь в точке ветвления, слияние будет содержать возврат ваших первоначальных изменений).

Это не может быть "правильным" способом, так как вы всегда можете пропустить ревизии при слиянии, но это, как правило, гораздо меньше головной боли для меня позже. Отказ от ответственности: я не свн гуру, поэтому мне может быть легче, потому что я делаю это неправильно - но я использую svn довольно часто.

2 голосов
/ 29 сентября 2008

Нет ничего плохого в том, чтобы следовать методу Филиппа, кроме того, что он оставляет некоторую «крошку» в истории ревизий. Если вы хотите удалить их ради аккуратности, а ревизии в HEAD, вы можете удалить их из хранилища, следуя этим инструкциям .

Обновление: Метод Филиппа лучше предложенного в вопросе по указанным им причинам. Мои и Филиппа методы были бы похожи, за исключением того, что вместо возврата ствола я предлагаю удалить ревизии из истории ревизий. (как я уже сказал, это можно сделать, только если все ревизии, которые вы хотите удалить, находятся в ГОЛОВЕ хранилища.)

0 голосов
/ 29 сентября 2008

У меня сейчас нет svn, но я бы попробовал это сделать:

Определите точку в истории, когда вы начали совершать плохие вещи (скажем, ревизия "100", когда вы находитесь на "130")

svn copy trunk branch # create your branch while preserving history
svn copy trunk@100 trunk #replace current revision with revision 100  

Это должно обойти плохую историю без добавления обратного слияния (на самом деле вы обходите историю ствола между 100 и 130, но вы сохранили ссылку на эту историю в ветви и обращаетесь к стволу, в то время как форсирование оборота все равно даст правильная история)

Тогда

svn switch branch workdir

это должно работать, если вы хотите полностью удалить изменения из транка. Если есть маленькие, которые вы хотите оставить, вы можете снова их выбрать из ветви в ствол (если вы используете SVN 1.5, он будет отслеживать точки слияния и избегать ложных конфликтов)

...