Как переименовать пакеты 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". Выделите оба и выберите "Восстановить перемещение" в контекстном меню.

Отредактировать ходы/переименования

Ответ 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, этот шаг должен содержать историю классов.
  • при завершении удаления старых папок
  • совершить!