【发布时间】:2021-08-24 12:53:23
【问题描述】:
我正在尝试从 git 标签 A 和 master 生成补丁,然后将该补丁作为单个提交应用到单独的分支 B(其最后一次提交标记为 A)。
我相信git 在生成补丁时遗漏了一些东西,导致它不能干净地应用。
有问题的文件it/my/application/Something.kt 包含类似于:
package it.my.application
import io.micronaut.runtime.event.annotation.EventListener
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
import it.my.application.SomethingFacade
import org.slf4j.LoggerFactory
import javax.inject.Singleton
typealias Something = Int
在master 中文件重命名为other/my/application/Something.kt 并改为:
package other.my.application
import io.micronaut.runtime.event.annotation.EventListener
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
import org.slf4j.LoggerFactory
import javax.inject.Singleton
import javax.transaction.Transactional
typealias SomethingId = Int
注意:
-
package it.my.application行已更改为package other.my.application -
import it.my.application.SomethingFacade行已删除 - 已添加行
import javax.transaction.Transactional
查看补丁,这些是git 为这部分代码生成的块:
diff --git a/src/main/kotlin/it/my/application/Something.kt b/src/main/kotlin/other/my/application/Something.kt
similarity index 91%
rename from src/main/kotlin/it/my/application/Something.kt
rename to src/main/kotlin/other/my/application/Something.kt
index ed24736..cb13606 100644
--- a/src/main/kotlin/it/my/application/Something.kt
+++ b/src/main/kotlin/other/my/application/Something.kt
@@ -1,10 +1,11 @@
-package it.my.application
+package other.my.application
import io.micronaut.runtime.event.annotation.EventListener
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
import org.slf4j.LoggerFactory
import javax.inject.Singleton
+import javax.transaction.Transactional
typealias SomethingId = Int
正如你从这个大块中看到的那样:
-
package行的更改已正确报告 - 已正确报告添加了
Transactional导入 - 没有提及删除
SomethingFacade行!
当尝试应用补丁 git 失败时说“它不匹配”..
我尝试使用-C 2/1/0 生成补丁,但它们都以某种方式失败(注意:我正在为整个目录生成一个补丁。使用-C 0 我相信这个文件可以工作,但无数其他文件可以不是)。
我可以做git apply --3way 并手动修复问题,但这样做实际上并没有发现问题...结果是:
package other.my.application
import io.micronaut.runtime.event.annotation.EventListener
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
import it.my.application.SomethingFacade
import org.slf4j.LoggerFactory
import javax.inject.Singleton
import javax.transaction.Transactional
typealias SomethingId = Int
所以关于SomethingFacade 的行被留下了。这是此文件的合并输出:
Checking patch src/main/kotlin/it/my/application/Something.kt => src/main/kotlin/other/my/application/Something.kt...
error: while searching for:
package it.my.application
import io.micronaut.runtime.event.annotation.EventListener
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
import org.slf4j.LoggerFactory
import javax.inject.Singleton
typealias SomethingId = Int
error: patch failed: src/main/kotlin/it/my/application/Something.kt:1
Falling back to three-way merge...
git 不应该生成:
--- a/src/main/kotlin/it/my/application/Something.kt
+++ b/src/main/kotlin/other/my/application/Something.kt
@@ -1,10 +1,11 @@
-package it.my.application
+package other.my.application
import io.micronaut.runtime.event.annotation.EventListener
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
-import it.my.application.SomethingFacade
import org.slf4j.LoggerFactory
import javax.inject.Singleton
+import javax.transaction.Transactional
typealias SomethingId = Int
或类似的东西:
--- a/src/main/kotlin/it/my/application/Something.kt
+++ b/src/main/kotlin/other/my/application/Something.kt
@@ -1,3 +1,3 @@
-package it.my.application
+package other.my.application
import io.micronaut.runtime.event.annotation.EventListener
@@ -4,7 +4,8 @@
import io.micronaut.transaction.annotation.TransactionalEventListener
import io.micronaut.transaction.annotation.TransactionalEventListener.TransactionPhase
-import it.my.application.SomethingFacade
import org.slf4j.LoggerFactory
@@ -7,10 +8,11 @@
import javax.inject.Singleton
+import javax.transaction.Transactional
typealias SomethingId = Int
?
为什么它直接忽略SomethingFacade 行?
附加信息(不确定这是否相关):
A 标记位于 master 分支的先前提交上,其内容与 B 分支的 HEAD 相同。 B 分支是从先前版本的 master 创建的,其中所有提交都被压缩为一个提交。
分支B 的要点是它应该隐藏提交活动和原始提交的作者。我们通过将所有新提交压缩到B 中的单个提交来定期同步master 和B。所以分支B 和master 没有共同的历史但是 对于B 的每个提交,都有一个master 的提交,其内容是相同的。
我不确定这是否会导致git diff 出现问题...我已在其他代码库中成功使用此方法而没有问题。
【问题讨论】: