如何在不破坏SVN的情况下重命名Python包中的文件夹?

如何在不破坏SVN的情况下重命名Python包中的文件夹?,python,svn,Python,Svn,在我的PyCharm项目中,我有这样一个结构: first_package └───first_package └───first_file.py secondpackage └───secondpackage └───second_file.py 我想从第一个包中删除下划线,但此包在第二个包(和其他包)中使用 使用PyCharm的重构工具,这应该是一项非常简单的任务,但是,如果PyCharm在没有事先通知的情况下将两个first_package目录重命名为firstpacka

在我的PyCharm项目中,我有这样一个结构:

first_package
└───first_package
    └───first_file.py
secondpackage
└───secondpackage
    └───second_file.py
我想从
第一个包
中删除下划线,但此包在
第二个包
(和其他包)中使用

使用PyCharm的重构工具,这应该是一项非常简单的任务,但是,如果PyCharm在没有事先通知的情况下将两个
first_package
目录重命名为
firstpackage
,我敢肯定SVN不会喜欢它

我对SVN的理解是,我应该使用
SVN mv
,然后是
SVN commit
,来更改文件/目录的名称。问题是,如果我这样做,我将在PyCharm之外重命名目录,那么毫无疑问,我将有一些容易出错的搜索和替换工作要做


我是否忽略了一个简单的解决方案?

从原始树开始:

.
├── first_package
│   └── first_package
│       └── first_file.py
└── secondpackage
    └── secondpackage
        └── second_file.py
继续,让您的重构工具将您的树变成:

.
├── firstpackage
│   └── firstpackage
│       └── first_file.py
└── secondpackage
    └── secondpackage
        └── second_file.py
然后
svn status
给出:

$ svn status
!       first_package
!       first_package/first_package
!       first_package/first_package/first_file.py
?       firstpackage
此时,如果我们尝试
svn mv
记录svn中发生的情况,我们会得到一个错误:

$ svn mv first_package firstpackage
svn: E155010: Directory '/tmp/tmp.wlyfVrQasv/repo/firstpackage' is not under version control
这是因为
svn mv
想要执行移动操作。它不仅仅记录已经发生的事情

选项1(简单) 在此解决方案中,您将丢失SVN历史记录。如果您不关心历史,而且重构实际上非常复杂,那么这可能是一个简单的选择

  • 对任何被
    svn status
    标记为
    的对象使用
    svn add
  • 对任何被
    svn status
    标记为
    的对象使用
    svn del
  • 选项2(完整) 此解决方案更好,因为它保留了历史

    保持代码原样,但手动撤消文件结构/名称更改,然后使用SVN重做这些更改。在这种情况下,我们从项目的根开始:

    $ svn status | grep -v /
    !       first_package
    ?       firstpackage
    
    要应用这一点:

    $ mv firstpackage first_package
    $ svn mv first_package firstpackage
    A         firstpackage
    D         first_package
    D         first_package/first_package
    D         first_package/first_package/first_file.py
    
    如果我们检查
    svn status
    并查找下一级
    (并过滤掉py文件)我们看到:

    接下来我们来处理这个问题:

    $ mv firstpackage/firstpackage firstpackage/first_package
    $ svn mv firstpackage/first_package firstpackage/firstpackage
    A         firstpackage/firstpackage
    D         firstpackage/first_package
    D         firstpackage/first_package/first_file.py
    
    现在我们有了您想要的目录结构,SVN很高兴:

    $ svn status
    D       first_package
            > moved to firstpackage
    A  +    firstpackage
            > moved from first_package
    D  +    firstpackage/first_package
            > moved to firstpackage/firstpackage
    A  +    firstpackage/firstpackage
            > moved from firstpackage/first_package
    

    现在,如果简单的解决方案是迁移到mercurial或git,那么您就可以
    svn提交了

    是的。JetBrains IDE通常对这类东西非常聪明。为什么不试试重构特性,看看会发生什么?除非您决定提交更改,否则更改不会“永久”它似乎应该在OOB(如果你与SVN集成)下工作。我没有足够的勇气尝试PyCharm。SVN已经够让人头疼的了,而且不必冒着不得不修复自己造成的问题的风险。事实上,我选择了@Stewart答案中的选项2。谢谢你的全面解决方案。我选择了选项2,因为我确实希望(需要)保留历史。
    $ svn status
    D       first_package
            > moved to firstpackage
    A  +    firstpackage
            > moved from first_package
    D  +    firstpackage/first_package
            > moved to firstpackage/firstpackage
    A  +    firstpackage/firstpackage
            > moved from firstpackage/first_package