将包含文件重命名和编辑的git提交拆分为两个提交

4
我正在进行一些重构工作,为了方便查看历史记录,我希望有明确定义的“将x文件夹更名为y”的提交与包含文件编辑的提交分开。
目前,我无法通过git暂存区将它们分开。
我确实知道我可以移动文件-提交,编辑文件-提交,移动-提交,编辑-提交,但是对于某些IDE,最好使用它们的移动功能来包含所有其他涉及的重构步骤,但是如果不能在git提交步骤中将其分开,我发现这是一个有点混乱的过程。
我更喜欢一个万能命令,类似于 git add -A :/,但在其中,指定只有 git文件更改步骤中的移动/重命名部分。
1个回答

4
这需要一些脚本编写,但是它可以完成:首先,将所有涉及重命名和编辑的更改提交到一个临时分支(下图中的TMP1)。
然后运行:
git show -M --name-status

这将显示已重命名的文件及其相似性指数,标记为 R<N>,例如:

$ git show -M --name-status
commit 07d207f4ca1754c6b12bddb4918f42f02f37ccc3
Author: Adi Levin <alevin@aligntech.com>
Date:   Wed Mar 2 16:39:19 2016 +0200

    ttt

R100    assetsdb/assetsdb.iml   assetsdb2/assetsdb.iml
A       assetsdb2/mvnw
A       assetsdb2/mvnw.cmd
R100    assetsdb/pom.xml        assetsdb2/pom.xml
R100    assetsdb/src/main/java/com/aligntech/assetsdb/Asset.java        assetsdb2/src/main/java/com/aligntech/assetsdb/Asset.java
R100    assetsdb/src/main/java/com/aligntech/assetsdb/AssetsDBDemoApp.java      assetsdb2/src/main/java/com/aligntech/assetsdb/AssetsDBDemoApp.java
R100    assetsdb/src/main/java/com/aligntech/assetsdb/DynamodbAssetsApplication.java    assetsdb2/src/main/java/com/aligntech/assetsdb/DynamodbAssetsApplication.java
R100    assetsdb/src/main/java/com/aligntech/assetsdb/RandomString.java assetsdb2/src/main/java/com/aligntech/assetsdb/RandomString.java
R100    assetsdb/src/main/resources/application.properties      assetsdb2/src/main/resources/application.properties
A       assetsdb2/target/application.properties
A       assetsdb2/target/classes/application.properties
A       assetsdb2/target/classes/com/aligntech/assetsdb/Asset.class
A       assetsdb2/target/classes/com/aligntech/assetsdb/AssetsDBDemoApp.class

请注意,默认相似度指标为50%。如果您想控制它,请使用-M90% -M100%仅用于相同的文件。
接下来,您需要解析此输出并提取已重命名文件的列表,然后返回到基本提交并创建一个新提交(如下图中的“已重命名”),其中这些文件仅被重命名 - 没有任何其他更改。
最后,您需要从Tmp1的工作目录中获取另外一个提交,并在Renamed之上进行提交,其中文件既被重命名又被编辑。
图片链接:enter image description here

1
哇!那个答案真是太棒了,我绝对没有预料到需要那种程度的交互,说实话,这是一个太大的疏忽,我看不出我们会使用那个解决方案。我会等待看看是否有更合理的解决方案出现,但如果没有,我会在一两天内将其标记为正确答案。谢谢Adi。 - seaders
好的。我尽力了 :-) 写一个自动完成所有这些操作的脚本可能需要1个小时左右,所以如果您经常需要这样做,那么这可能值得一试。 - Adi Levin
是的,我的原始问题和那个评论更多是对git中这个功能的看法,而不是对你的解决方案,你的解决方案完全可以接受。 - seaders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接