【问题标题】:git: merging commits from remote repository into subtree following renaminggit:重命名后将远程存储库中的提交合并到子树中
【发布时间】:2022-10-06 08:15:06
【问题描述】:

所以我使用 git subtree 策略将存储库分支合并到另一个作为子目录。 首先我使用git subtree add -P some/dir1 myremote dev。 然后我将子树目录重命名为some/dir2。那是一个错误,因为重命名似乎打破了git对子树集成的认识,现在我不能使用git subtree命令来合并远程更改,其他与子树相关的操作不会考虑重命名之前的提交。

newrepo 分支:

(create subtree some/dir1 from remote/C0) - C1 - (rename some/dir1 some/dir2) - C2 - HEAD

这里 C1 和 C2 代表许多提交。 创建子树的oldrepo

C0 -- C1 - HEAD

来自oldrepo 的远程分支包含自最初并入newrepo 以来的许多提交。 如果这些是同一存储库中的分支:

(oldrepo) C0 - C1 ------------------------------------ HEAD
(newrepo)  \\ 
            D0 - D1 - (rename some/dir1 some/dir2) - D2 - HEAD

(这里 D0 是初始 git subtree add 操作生成的提交,因此它对应于 C0。如果这是同一个 repo 中的分支,则 C0 和 D0 将是相同的提交。) 现在,git subtree pull -P some/dir2 oldrepo dev 因不相关的历史而失败。

考虑到自初始合并以来的所有提交,包括重命名之前和之后的所有提交,是否有某种方法可以将 oldrepo 的更改合并到 newrepo 子树中?

基本上,有没有办法告诉 git D0 是来自oldrepo 的提交的共同祖先,并且子树目录的重命名不会影响来自 oldrepo 的提交?

谢谢!

  • 自从我更换雇主以来,我没有携带代码,但我记得手动编辑保存子树信息以及文件夹更改的文件。当您最初重命名时,这可能会防止出现问题。也许它可以帮助修补它?
  • 你知道那是什么文件吗?
  • 如果您以与最初相同的方式运行git subtree,在同一个原始存储库上,它应该生成相同系列的提交,以便任何新提交都应添加为相关历史记录。虽然已经有关于 git subtree 中的错误的报告,而且它的维护很差。
  • @CharlesLanglois 不幸的是,没有,但您可以尝试使用文件夹名称或远程地址的 grep,您应该会找到它。好机会!

标签: git git-subtree


【解决方案1】:

我相信我能够解决这种情况。 首先,通过在重命名发生之前从提交中分支出来。 然后使用git subtree pull ...(现在理解了现有的子树)。 然后将主分支合并到新分支中,从而添加剩余的提交,从重命名提交到newrepo/main 的头部。 一切顺利,冲突最小,因为重命名被 git 理解并应用于来自新提交的新文件。 最后,我将临时分支合并回主分支。

  
(newrepo/main) D0 ----------M3 (HEAD)
                \           /
(newrepo/temp)   M1-------M2

D0: (commit before renaming)
M1: (git subtree pull --squash -P some/dir1 oldrepo dev) 
M2: (git merge main)
M3: (git merge temp)

【讨论】:

    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 2014-05-30
    • 2018-08-30
    • 1970-01-01
    • 2012-05-09
    • 2014-09-21
    • 2010-09-20
    相关资源
    最近更新 更多