首页 > 解决方案 > 如何在不破坏 SVN 的情况下重命名 Python 包中的文件夹?

问题描述

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

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

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

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

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

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

标签: pythonsvn

解决方案


从您的原始树开始:

.
├── 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 add任何标记为svn statusas的东西?
  2. 用于svn del任何标记为svn statusas的东西!

选项 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 文件),我们会看到:

$ 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


推荐阅读