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

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

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

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

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

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

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

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

М. Следующих


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

процедура:

  1. создать новый пакет com.старое_имя.тест.renametest.субпакет.
  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.подпакет, содержащий:

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

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

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

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

7 ответов


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

  1. используйте функцию рефакторинга IDE для переименования материалов.
  2. запустите диалог "проверить наличие изменений" из TortoiseSVN.
  3. для каждого переименованного элемента вы увидите две записи: отсутствующий " источник.Ява" и версии "цель.java " item. Выделите оба и выберите "Repair move" из контекста меню.

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


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


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

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

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

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


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

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


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

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

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

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


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

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

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


вместо переименования пакетов вы можете сделать следующее:

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

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

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