如何重命名Java包而不破坏Subversion历史记录?

时间:2010-03-21 04:28:31

标签: java eclipse svn tortoisesvn renaming

我正在为之工作的公司正在启动,他们在此过程中更改了名称。所以我们仍然使用包名com.oldname,因为我们害怕打破文件更改历史记录,或者版本之间的祖先链接,或者我们可能破坏的任何东西(我不认为我使用正确的术语,但你得到了概念)。

我们使用:Eclipse,TortoiseSVN,Subversion

我发现somewhere我应该在很多步骤中执行此操作,以防止.svn文件夹的内容与java文件中的包名称之间出现不一致:

  • 首先使用TortoiseSVN重命名目录,更新.svn目录。
  • 然后,手动将目录重命名为原始名称。
  • 最后使用Eclipse将包(refactor)重命名为新名称,更新java文件。

这对我来说似乎很好,但我需要知道祖先和历史以及其他一切是否仍然连贯并且运作良好。

我没有该服务器的密钥,这就是为什么我不急着备份东西并尝试一两件事。我想提出一个不这样做的理由,或者一种有效的方法。

感谢您的帮助,

微米。 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. 提交。
  6. 更改两个类的消息。
  7. 提交。
  8. 再次,更改一个类的消息并提交(只创建一些历史记录)。
  9. 应用上面提出的程序(原始邮件中的三个步骤)将包重命名重命名为testrename。
  10. 提交。
  11. 试运行。
  12. 再次修改消息并进行测试。
  13. 提交。
  14. 尝试在第一次同时更改两条消息时回滚到该版本。
  15. 如果到目前为止一切正常,那看起来不错,不是吗?
  16. 测试结果:

    • 关于步骤9的注意事项:必须以逆序(Eclipse重命名THEN TortoiseSVN重命名)来执行此操作,否则它会变得复杂,因为TSVN会创建一个新文件夹/包并标记旧文件夹/包删除...所以你不能重命名为Eclipse,除非你同时把旧包放在其他地方,以防止丢失.svn文件夹等等。这个方法更进一步看起来不是一个好主意。 (请注意:不要忘记勾选递归包重命名的复选框!)
    • 关于第14步的说明:工作了!我们可以看到以前的版本;我们所要做的就是告诉不要在复制/移动中断,这没关系。一旦恢复到重命名之前的版本,包名称虽然没有回到好名字,可能再次重构它就可以了。
    • 结束说明:我很惊讶必须按相反顺序执行关键步骤。为了在第一个包重命名试验的中间做到这一点,我不得不回滚一些TSVN和手动修改,对这个过程的确切结果的可重复性质产生了一些疑问。我将不得不做第二次测试以确认其有效性。 总结:它看起来不错,但需要进一步测试。

7 个答案:

答案 0 :(得分:8)

也许这对你的确切需求并不实际,但TortoiseSVN有一个关于重命名的便利功能。你可以这样做:

  1. 使用IDE的重构功能重命名内容。
  2. 启动TortoiseSVN的“检查修改”对话框。
  3. 对于每个重命名的项目,您将看到两个条目:缺少“source.java”项和未版本化的“target.java”项。突出显示两者并从上下文菜单中选择“修复移动”。
  4. Repair moves/renames

答案 1 :(得分:3)

您是否考虑过使用Subclipse plugin?根据{{​​3}}

,它可以解决您的问题

答案 2 :(得分:2)

如果你使用eclipse中包含的重构方法,你确定保持历史记录不起作用吗?

使用NetNeans,我会定期更改软件包名称,底层的“svn插件”将默默地移动内容(保存历史记录)到新目录中(之后将进行正常的重构)。

所以:如果历史记录与subversion插件一起保存,你是否已经在eclipse中尝试过? (例如,在新的签出副本中以避免失败)

至少你可以使用NetBeans来执行这个一次性任务......

答案 3 :(得分:0)

是的,它会起作用。您可以安装svn的命令行版本并编写一个将执行svn的批处理文件。自动化eclipse的东西会有点多工作,除非你已经熟悉eclipse API,否则可能不值得。

在你做所有事情之前用一个包测试它,以确保你正在做所有正确的步骤。

答案 4 :(得分:0)

可以做到这一点,并不是那么难 - 获得一个干净的SVN历史记录的最好方法是分两步完成(可以成为一个提交) - 虽然为了获得好的结果我推荐使用CLI客户端。

  1. 使用svn mv移动文件夹/包
  2. 进入Eclipse,或使用CLI中的grep修复文件中的包以匹配新名称
  3. 然后您可以作为更改集提交,文件级别的历史记录应该匹配。

    如果你正在使用Maven或包装工具,建议你在做这样的事情之前运行一个版本 - 如果你需要回到原来的结构,也应该在此之前立即剪标签

答案 5 :(得分:0)

我发现subclipse插件在提交已移动到新包(即尚未在源代码控制下)的类时提供错误消息“已经在版本控制下”,并且此包的父级是也是新的

当发生这种情况时,我可以使用TortoiseSVN提交更改。之后我只需要在Eclipse中刷新项目。

将一个类移动到其父级已经处于源代码管理之下的新包之后,subclipse可以毫无问题地提交此更改。

答案 6 :(得分:0)

您可以执行此操作,而不是重命名包:

  1. 在项目中创建新的包结构。完成后,您的项目应如下所示:

           com -
               |- myOLDcompname -
               |                |- feature1 -
               |                            |- classA.java
               |                            |- classB.java
               |- myNEWcompname -
                                |- feature1
    
  2. 在版本控制下添加新文件夹,以便svn可以跟踪它们

  3. 将您的java类从旧包移动到新包。 Eclipse应该相应地更新所有类的import和package声明。最重要的是因为旧的和新的包都在vcs下,这一步应该保留类的历史。
  4. 完成后删除旧文件夹
  5. 提交<!/ LI>