Как переименовать пакеты Java, не нарушая истории Subversion?

Компания, в которой я работаю, запускается, и в процессе они изменили свое название. Таким образом, мы по-прежнему используем имя пакета com.oldname, потому что мы боимся нарушить историю изменений файлов, или родственные связи между версиями, или что-то еще, что мы могли бы нарушить (я не думаю, что использую правильные термины, но вы понимаете концепцию ).

Мы используем: Eclipse, TortoiseSVN, Subversion

Я нашел где-то, что мне нужно сделать это в несколько этапов чтобы предотвратить несоответствие между содержимым папок .svn и именами пакетов в файлах java:

  • Сначала используйте TortoiseSVN, чтобы переименовать каталог, обновив каталоги .svn.
  • Затем вручную переименуйте каталог обратно в исходное имя.
  • Чтобы, наконец, использовать Eclipse для переименования пакетов (рефакторинга) обратно на новое имя, обновив файлы java.

Мне это кажется хорошим, но мне нужно знать, будут ли по-прежнему согласованы и хорошо работают происхождение, история и все остальное.

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

Спасибо за помощь,

М. Джоанис


Тест на переименование пакета

Процедура:

  1. Создайте новый пакет com.oldname.test.renametest.subpackage.
  2. Добавьте новый класс в renametest под названием 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();
        }
    }
  3. Добавьте новый класс в renametest.subpackage, содержащий:

    class RenameTest1 {
        public RenameTest1() {
            showMessage();
            RenameTest0.showMessage();
        }
        public static void showMessage() {
            System.out.println("RenameTest1!");
        }
    }
  4. Убедитесь, что RenameTest0 работает нормально.

  5. Совершить.
  6. Измените сообщения обоих классов.
  7. Совершить.
  8. Опять же, измените сообщение одного класса и выполните фиксацию (просто создав некоторую историю).
  9. Примените предложенную выше процедуру (три шага в исходном сообщении) для переименования пакета renametest в testrename.
  10. Совершить.
  11. Тестовый забег.
  12. Снова измените сообщения и проверьте.
  13. Совершить.
  14. Попробуйте откатиться к версии, когда оба сообщения были изменены одновременно в первый раз.
  15. Если до этого момента все работало нормально, все в порядке, не так ли?

Результат теста:

  • Примечание к шагу 9: нужно было сделать это в обратном порядке (Eclipse переименовал ТОГДА в TortoiseSVN переименовать.), Иначе это усложнялось, поскольку TSVN создает новую папку / пакет и отмечает старую для удаления. .. Таким образом, вы не можете переименовать Eclipse, если пока не поместите старый пакет в другое место, чтобы предотвратить потерю папок .svn и т. Д. И т. Д. Не было хорошей идеей продолжать использовать этот метод. (На заметку: не забудьте поставить галочку для рекурсивного переименования пакетов!)
  • Примечание к шагу 14: Работает! Мы видим предыдущие версии; все, что нам нужно сделать, это сказать не ломаться при копировании / перемещении, и все в порядке. После возврата к версии перед переименованием имена пакетов не возвращаются к хорошему имени, возможно, повторный рефакторинг сделает это.
  • Конечное примечание: я был удивлен, когда мне пришлось проделывать важные шаги в обратном порядке. Чтобы сделать это прямо в середине этой первой попытки переименования пакета, мне пришлось откатить некоторые TSVN и ручные модификации, что немного усомнилось в повторяемости точных результатов этой процедуры. Мне нужно будет сделать второй тест, чтобы подтвердить его действительность. Подводя итог: выглядит неплохо, но требует дальнейшего тестирования.

person Joanis    schedule 21.03.2010    source источник
comment
Хорошая причина не делать этого - это большой объем работы (включая тестирование) без всякой пользы. Если вы думаете, что кто-то собирается начать создавать библиотеки в пространстве com.oldname, которые будут конфликтовать с вашим, это того стоит, но вся идея доменных префиксов заключалась в том, чтобы гарантировать уникальность, а не удовлетворять маркетологов.   -  person msw    schedule 21.03.2010
comment
Должен признать, это очень хороший момент ...   -  person Joanis    schedule 22.03.2010
comment
@Don Kirby & @Karussell: Я попробую провести тест сегодня или завтра и расскажу об этом здесь.   -  person Joanis    schedule 22.03.2010
comment
Только что добавил процедуру + результаты первого теста переименования пакетов, который я сделал вчера вечером.   -  person Joanis    schedule 23.03.2010


Ответы (7)


Возможно, это непрактично для ваших конкретных нужд, но TortoiseSVN имеет удобную функцию переименования. Вы могли сделать это:

  1. Используйте функцию рефакторинга вашей IDE для переименования файлов.
  2. Запустите диалоговое окно «Проверить наличие изменений» из TortoiseSVN.
  3. Для каждого переименованного элемента вы увидите две записи: отсутствующий элемент «source.java» и неверсированный элемент «target.java». Выделите оба и выберите «Восстановить ход» в контекстном меню.

Исправить перемещение / переименование

person Álvaro González    schedule 23.03.2010
comment
Но это не сработает, если у вас также установлен плагин Eclipse SVN, как Subclipse, верно? - person User; 14.04.2015

Рассматривали ли вы использование подключаемого модуля Subclipse? Это может решить ваши проблемы, согласно Как использовать инструменты рефакторинга Eclipse и поддерживать синхронизацию с SVN через Subclipse?

person markusk    schedule 23.03.2010

Вы уверены, что ведение истории НЕ работает, если вы используете метод рефакторинга, включенный в eclipse?

В NetNeans я регулярно меняю имена пакетов, и базовый «плагин svn» будет без уведомления перемещать контент (который сохраняет историю) в новый каталог (после этого произойдет нормальный рефакторинг).

Итак: вы пробовали это изнутри eclipse, если история сохраняется с помощью плагина subversion? (например, в новой копии для выписки, чтобы избежать сбоя)

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

person Karussell    schedule 21.03.2010
comment
+1: даже вопрос был по затмению, это мне очень помогло. плагин netbeans отлично работает для меня. (просто обновите репутацию ПЛАГИНОМ, а не другим svn-клиентом перед выполнением рефакторинга) - person Loda; 18.01.2012

Да, сработает. Вы можете установить версию svn для командной строки и написать командный файл, который будет выполнять работу svn. Автоматизация работы с eclipse потребует немного больше усилий и, вероятно, того не стоит, если вы уже не знакомы с eclipse API.

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

person Don Kirkby    schedule 21.03.2010

Вы можете сделать это, и это не так сложно - лучший вариант для получения чистой истории SVN - это сделать это за 2 шага (может стать одной фиксацией) - хотя для хороших результатов я рекомендую использовать CLI клиент.

  1. Используйте svn mv для перемещения папок / пакетов
  2. Войдите в Eclipse или используйте команду grep из интерфейса командной строки, чтобы исправить пакеты в файлах, чтобы они соответствовали новому имени.

Затем вы можете зафиксировать как набор изменений, и история на уровне файла должна совпадать.

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

person jayshao    schedule 22.03.2010

Я обнаружил, что подключаемый модуль subclipse выдает сообщение об ошибке «уже находится под контролем версий» при фиксации класса, который был перемещен в новый пакет (т.е. еще не находился под контролем версий) и родительский элемент этого пакета также является новым < / сильный>.

Когда это произойдет, я могу зафиксировать изменения с помощью TortoiseSVN. После этого мне нужно только обновить проект в Eclipse.

После перемещения класса в новый пакет, родительский элемент которого уже находится под контролем версий, subclipse может без проблем зафиксировать это изменение.

person gogognome    schedule 02.01.2013

Вместо переименования пакетов вы можете сделать это:

  1. создайте новую структуру пакета в своем проекте. После завершения ваш проект должен выглядеть примерно так:

           com -
               |- myOLDcompname -
               |                |- feature1 -
               |                            |- classA.java
               |                            |- classB.java
               |- myNEWcompname -
                                |- feature1
    
  2. добавить новые папки в систему контроля версий, чтобы svn мог их отслеживать

  3. переместите свои классы Java из старых пакетов в новые. Eclipse должен соответствующим образом обновить все импортируемые классы и объявления пакетов. Самое главное, потому что старые и новые пакеты находятся в vcs, на этом шаге должна сохраняться история классов.
  4. когда закончите, удалите старые папки
  5. совершить!
person jule64    schedule 07.03.2015