svn 合并信息-E195016:"must be ancestrally related"

svn mergeinfo - E195016: "must be ancestrally related"

虽然这里(例如 SVN - Reintegration Merge error: "must be ancestrally related")和网上有几个类似的问题,但我无法弄清楚为什么 svn mergeinfo <file> 会导致我所有的 SVN 存储库出错。与我找到的所有其他问答相比,我实际上能够成功执行 svn merge。例如,撤消对 pom.xml 文件的先前提交:

svn merge -r 17409:17408 pom.xml
--- Reverse-merging r17409 into 'pom.xml':
U    pom.xml
--- Recording mergeinfo for reverse merge of r17409 into 'pom.xml':
U   pom.xml
--- Eliding mergeinfo from 'pom.xml':
U   pom.xml

但是,当我执行 svn mergeinfo 时,出现以下错误:

svn: E195016: 'https://../trunk/MyProject/pom.xml@50446' must be ancestrally related to
'https://../trunk/MyProject@50446'

在这个例子中,50446 是当前的主要修订号,我对我尝试过的每个文件都遇到了同样的错误。只有当我在顶级目录本身上执行 mergeinfo 命令时,它才有效:

svn mergeinfo .
    youngest common ancestor
    |         last full merge
    |         |        tip of branch
    |         |        |         repository path
    50446              50446   
    |                  |       
  -------| |------------         ../trunk/MyProject
     \                         
      \                        
       --| |------------         ../trunk/MyProject
                       |       
                       50446   

更奇怪的是,我没有找到任何 mergeinfo 属性集。 svn propget svn:mergeinfo --recursivesvn propget svn:mergeinfo --depth=infinity 等命令不输出任何内容,return 成功,状态码为 0。

有没有人知道如何修复我们的文件,使其再次 "ancestrally related" 到它们所在的项目?

简答:svn mergeinfo <file>错了。

来自 SVN 文档(svn help mergeinfo):

"Summarize the history of merging between SOURCE and TARGET."

"SOURCE and TARGET are the source and target branch URLs, respectively."

"The default TARGET is the current working directory ('.')."

因此,如果您的命令类似于 svn mergeinfo pom.xml,那么错误消息就是预期的,因为该文件与其目录之间没有“祖先关系”。
正确的命令是:svn mergeinfo pom.xml pom.xml,它将比较这两个文件,可能就是您想要的。

当你运行svn mergeinfo .时,与运行宁svn mergeinfo . .是一样的。所以它起作用了,你得到了 mergeinfo 输出。

您也可以 运行 svn mergeinfo pom.xml pom.xml@12345 来比较特定的修订版。


您在尝试合并不相关的事物时也可能会遇到此错误。
如果您手动创建目录树或文件(我的意思是:不使用分支功能),那么它们不相关,您将收到此错误。

请阅读this question并注意作者手动创建了分支dev,破坏了SVN。

在这种情况下,最好的解决方案是正常创建分支,手动将所有文件迁移到该分支(复制粘贴所有内容),然后将其合并回 t运行k。