Как переименовать пакеты Java, не нарушая историю Subversion? - PullRequest
16 голосов
/ 21 марта 2010

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

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

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

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

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

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

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

M. Joanis


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

Процедура:

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

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

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

Ответы [ 7 ]

8 голосов
/ 23 марта 2010

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

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

Ремонт перемещений / переименований

3 голосов
/ 23 марта 2010

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

2 голосов
/ 21 марта 2010

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

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

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

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

0 голосов
/ 07 марта 2015

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

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

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

  3. переместите ваши Java-классы из старых пакетов в новые. Eclipse должен обновить все импорты классов и объявления пакетов соответственно. Самое главное, потому что старые и новые пакеты находятся под vcs, этот шаг должен сохранять историю классов.
  4. когда закончите, удалите старые папки
  5. совершить!
0 голосов
/ 02 января 2013

Я обнаружил, что плагин subclipse выдает сообщение об ошибке "уже находится под управлением версией" при фиксации класса, который был перемещен в новый пакет (т. Е. Пока не находится под контролем исходного кода) , и родитель этого пакета также новый .

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

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

0 голосов
/ 22 марта 2010

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

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

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

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

0 голосов
/ 21 марта 2010

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

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

...