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

How to rename folders in Python package without breaking SVN?

我的 PyCharm 项目中有这样的结构:

first_package
└───first_package
    └───first_file.py
secondpackage
└───secondpackage
    └───second_file.py

我想从 first_package 中删除下划线,但此包用于 secondpackage(和其他)。

使用 PyCharm 的重构工具,这应该是一个非常简单的任务,但是,我很确定如果 PyCharm 重命名两个 [=12],SVN 不会喜欢它=] 目录到 firstpackage 而不先通知它。

我对SVN的理解是,我应该使用svn mv,然后是svn commit来更改files/directories的名称。问题是,如果我这样做,我将重命名 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 历史记录。如果您不关心历史,并且重构实际上非常复杂,那么这可能是简单的选择。

  1. svn status 标记为 ? 的任何内容使用 svn add
  2. svn status 标记为 ! 的任何内容使用 svn del

选项 2(完成)

这个解决方案更好,因为它保留了历史记录。

按原样保留您的代码,但手动撤消 file-structure/name 更改,然后使用 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 文件),我们会看到:

$ svn status | grep '^[!?]' | grep -v py
!       firstpackage/first_package
?       firstpackage/firstpackage

接下来我们来处理:

$ 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

现在您可以svn commit