如何在不破坏 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 历史记录。如果您不关心历史,并且重构实际上非常复杂,那么这可能是简单的选择。
- 对
svn status
标记为 ?
的任何内容使用 svn add
。
- 对
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
。
我的 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 历史记录。如果您不关心历史,并且重构实际上非常复杂,那么这可能是简单的选择。
- 对
svn status
标记为?
的任何内容使用svn add
。 - 对
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
。