在模块之间移动函数时,保留Git提交消息的顺序

在模块之间移动函数时,保留Git提交消息的顺序,git,pycharm,commit,Git,Pycharm,Commit,我为我的项目组织了专门模块中的函数和类。我使用PyCharm在Python中编写代码 我经常需要对项目中的模块进行重组 使用Git,如何在将函数从一个模块移动到另一个模块时保留所有提交消息?显然,这不是自动发生的() 我想出了一个解决办法: 由于我可以看到模块内单个功能的历史记录(我在终端中发出以下命令: git log -L :myfunction:path/to/myfile.py --follow path/to/myfile.py >> myfunction_commit

我为我的项目组织了专门模块中的函数和类。我使用PyCharm在Python中编写代码

我经常需要对项目中的模块进行重组

使用Git,如何在将函数从一个模块移动到另一个模块时保留所有提交消息?显然,这不是自动发生的()


我想出了一个解决办法:

  • 由于我可以看到模块内单个功能的历史记录(我在终端中发出以下命令:

    git log -L :myfunction:path/to/myfile.py --follow path/to/myfile.py >> myfunction_commit_history.txt
    
  • 我将myfunction移动到我的新文件(使用PyCharm GUI,但如果通过命令行移动它,同样适用)

  • 我从myfunction_commit_history文件复制提交历史记录

这并不伟大,但总比失去整个提交历史要好

欢迎任何建议。

Git中的“保存提交历史”一词毫无意义

原因是提交是历史;历史只不过是提交。您要么拥有提交,所以所有内容都被保留,要么没有,所以它不是

人们通常这样说的意思是:我重命名了一些文件,但现在找不到它。这并不奇怪,因为每次Git提交都只是所有文件的快照。提交
a
有文件
README.txt
starter.py
,最后提交
Z
README.rst
alldone.py
.If
README.rst
是一个重命名(也可能是修改)在这条路上的某个地方,唯一能找到它的方法是Git走,一次提交一次,从
Z
返回到
Y
返回到
X
,直到在某个时刻,比如说在
M
N
之间-比较两次提交的内容表明,
M
中的
README.txt
wful很像
N
中的
README.rst
,所以让我们称之为重命名,停止查找
README.rst
,转而开始查找
README.txt
。这就是
git log——follow
的作用

如果你直接从
Z
跳到
A
,两个文件的内容可能相差太大,无法匹配。但这对Git来说没关系:如果你问我如何编辑
A
中的文件,使它们看起来像
Z
中的文件,Git会说,删除
README.txt
,然后创建一个新的
README.rst
包含这些内容,并且这些指令有效。它们不会告诉您想要知道什么,但就Git而言,它们已经足够好了


当您将函数从一个文件移动到另一个文件时,Git的某些部分,包括
Git-gull
,可以逐个提交比较,搜索早期提交中的所有文件,并找到它(对于
Git-gull
,您需要
-C
选项,而对于
Git-log
则需要
-follow
选项)。Git的其他部分,包括直接区分早期提交和延迟提交,通常不能:在比较任何一对提交时,重命名的文件必须与原始文件足够相似,才能使用
-M
/
--find renames
选项。打开时,可以调整重命名查找阈值:
-M
在没有任何阈值的情况下,使用50%的相似性索引,即Git在两次提交中必须有大约一半的文件相同才能调用该重命名操作。但此重命名检测还需要满足其他几个条件。通常,将函数从一个现有文件移到另一个现有文件将导致其失败。对于de>git diff您有时也可以使用
-B
(break pairings标志,它最多占用两个相似性索引值),但它的有用性会迅速降低。

如果我将标题重命名为“preserve commit messages of moved function”是否更好?当我移动函数时,这确实是我想要保留的,这肯定更合理,但是没有办法这样做,因为提交消息附加到提交。