Как переименовать пакеты Java, не нарушая историю Subversion?
Компания, над которой я работаю, запускается, и они изменили свое название в процессе. Поэтому мы по-прежнему используем имя пакета com.oldname, потому что боимся сломать историю изменений файла или ссылки на родословную между версиями или что бы мы ни сломали (я не думаю, что я использую правильные условия, но вы получаете концепцию).
Мы используем: Eclipse, TortoiseSVN, Subversion
Я нашел где-нибудь, что я должен сделать это несколькими шагами, чтобы предотвратить несогласованность между содержимым .svn папок и имен пакетов в java файлах:
- Сначала используйте TortoiseSVN, чтобы переименовать каталог, обновив каталоги .svn.
- Затем вручную переименуйте каталог обратно в исходное имя.
- Чтобы, наконец, использовать Eclipse для переименования пакетов (refactor) на новое имя, обновление java файлов.
Мне кажется, что мне хорошо, но мне нужно знать, будет ли происхождение и история и все остальное быть последовательными и хорошо работать.
У меня нет ключей к этому серверу, поэтому я не спешу делать резервные копии вещей и попробовать одну или две вещи. Я хотел бы найти хорошую причину, чтобы не делать этого, или способ сделать это, который работает.
Благодарим вас за помощь,
М. Joanis
Тест переименования пакетов
Процедура:
- Создайте новый пакет com.oldname.test.renametest.subpackage.
-
Добавить новый класс под renamestest с именем RenameTest0.java и содержащий:
class RenameTest0 {
public RenameTest0() {
showMessage();
new RenameTest1();
}
public static void showMessage() {
System.out.println("RenameTest0!");
}
public static void main(String[] args) {
new RenameTest0();
}
}
-
Добавить новый класс под renametest.subpackage, содержащий:
class RenameTest1 {
public RenameTest1() {
showMessage();
RenameTest0.showMessage();
}
public static void showMessage() {
System.out.println("RenameTest1!");
}
}
-
Проверьте, что RenameTest0 работает нормально.
- Commit.
- Измените сообщения обоих классов.
- Commit.
- Снова измените сообщение одного класса и зафиксируйте (просто создав некоторую историю).
- Применить процедуру, предложенную выше (три шага исходного сообщения) для переименования пакета renametest в testrename.
- Commit.
- Тестирование.
- Изменить сообщения еще раз и проверить.
- Commit.
- Попробуйте вернуться к версии, когда оба сообщения были изменены одновременно в первый раз.
- Если все сработало до этого момента, это выглядит хорошо, нет?
Результат теста:
- Примечание на шаге 9: Придется сделать это в обратном порядке (Eclipse переименовать THEN TortoiseSVN переименовать.), иначе это осложнялось, поскольку TSVN создавал новую папку/пакет и маркировал старый для удаления... Итак, вы не может переименовываться для Eclipse, если вы не ставите старый пакет где-то еще, чтобы предотвратить потерю папок .svn и т.д. и т.д. Не было хорошей идеей пойти дальше с этим методом. (Обратите внимание на себя: не забудьте поставить галочку для переименования рекурсивного пакета!)
- Примечание на шаге 14: Работаем! Мы можем видеть предыдущие версии; все, что нам нужно сделать, это сказать, чтобы не ломаться на копирование/перемещение, и все в порядке. Вернувшись к версии перед переименованием, имена пакетов не вернутся к хорошему имени, хотя, возможно, что рефакторинг он снова сделает.
- Конечная нота: я был удивлен, что нужно сделать критические шаги в обратном порядке. Чтобы сделать это прямо в середине этого первого переименования пакета, попробуйте, я должен был отбросить некоторые TSVN и ручные модификации, слегка усомнившись в повторяемости характера точных результатов этой процедуры. Мне нужно сделать второй тест, чтобы подтвердить его достоверность. Подводя итог: он выглядит хорошо, но нуждается в дальнейшем тестировании.
Ответы
Ответ 1
Возможно, это не практично для ваших конкретных потребностей, но TortoiseSVN имеет удобную функцию переименования. Вы можете сделать это:
- Используйте функцию рефакторинга IDE для переименования.
- Запустите диалог "Проверить изменения" от TortoiseSVN.
- Для каждого переименованного элемента вы увидите две записи: отсутствующий элемент "source.java" и неверсированный элемент "target.java". Выделите оба и выберите "Восстановить перемещение" в контекстном меню.
Отредактировать ходы/переименования
Ответ 2
Рассматривали ли вы использование плагина подзапроса? Он может решить ваши проблемы, в соответствии с Как использовать инструменты рефакторинга Eclipse и синхронизировать с SVN через Subclipse?
Ответ 3
Вы уверены, что сохранение истории НЕ работает, если вы используете метод рефакторинга, включенный в eclipse?
С NetNeans я регулярно меняю имена пакетов, и основной "svn-плагин" беззвучно перемещает содержимое (которое сохраняет историю) в новый каталог (после этого произойдет нормальный рефакторинг).
so: Пробовали ли вы его из затмения, если история хранится с плагином subversion? (например, в новой копии выписки, чтобы избежать сбоя)
По крайней мере, вы можете использовать NetBeans для выполнения этой одноразовой задачи...
Ответ 4
Да, это сработает. Вы можете установить версию svn в командной строке и написать пакетный файл, который будет выполнять материал svn. Автоматизация затмения будет немного больше работы и, вероятно, не стоит того, если вы уже знакомы с API eclipse.
Протестируйте его одним пакетом, прежде чем делать все, только чтобы убедиться, что вы делаете все шаги правильно.
Ответ 5
Вы можете сделать это, и это не так сложно - лучший способ получить чистую историю SVN - сделать это за 2 шага (может стать одним фиксатором) - хотя для хороших результатов я рекомендую использовать клиент CLI.
- Использование svn mv для перемещения папок/пакетов
- Перейдите в Eclipse или используйте grep из CLI, чтобы исправить пакеты в файлах в соответствии с новым именем
Затем вы можете зафиксировать как набор изменений, и история на уровне файла должна соответствовать.
Если вы используете Maven или инструмент для упаковки, рекомендуем вам запустить выпуск, прежде чем делать что-то подобное - также стоит отрезать тег непосредственно перед этим, если вам нужно вернуться к старой структуре
Ответ 6
Я обнаружил, что плагин subclipse дает сообщение об ошибке "уже находится под управлением версиями" при передаче класса, который был перемещен в новый пакет (т.е. еще не под контролем источника) , а родительский элемент этого пакета также новый.
Когда это произойдет, я могу зафиксировать изменения с помощью TortoiseSVN. После этого мне нужно только обновить проект в Eclipse.
После перемещения класса в новый пакет, родительский элемент которого уже находится под контролем источника, подзаголовок может без проблем выполнить это изменение.
Ответ 7
Вместо переименования пакетов вы можете сделать это:
-
создать новую структуру пакета в вашем проекте. Когда-то ваш проект должен выглядеть примерно так:
com -
|- myOLDcompname -
| |- feature1 -
| |- classA.java
| |- classB.java
|- myNEWcompname -
|- feature1
-
добавить новые папки под управлением версиями, чтобы svn мог отслеживать их
- переместите свои классы Java из старых пакетов в новые. Eclipse должен обновить все классы импорта и декларации пакетов соответственно. Самое главное, потому что старые и новые пакеты находятся под vcs, этот шаг должен содержать историю классов.
- при завершении удаления старых папок
- совершить!