python - 如何在不破坏 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 之外的目录,然后毫无疑问我会做一些容易出错的搜索和替换工作。
我是否忽略了一个简单的解决方案?
解决方案
从您的原始树开始:
.
├── 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 add
任何标记为svn status
as的东西?
。 - 用于
svn del
任何标记为svn status
as的东西!
。
选项 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
。
推荐阅读
- python - 使用函数为字符串中的每个字符连接字符串
- javascript - 来自 BehaviorSubject 的值未在订阅的组件中呈现
- graphviz - 强制子图之间的边向左或向右
- git - Github Actions - 我如何使用私有模板仓库创建子文件夹
- facebook-opengraph - 来自调试器的 og:url 不等于来自 html 代码的 og:url
- c - 多个线程中只有一个正在写入
- azure - 使用 API 获取 Azure 服务主体应用程序级别权限
- android - LiveData 的竞争条件
- javascript - 在 next/react 组件中实现页面 javascript
- javascript - 如何通过替换原始数组来替换另一个数组中的唯一值