gpt4 book ai didi

git - 将其他 repo merge 到子目录后修复损坏的 git 历史记录

转载 作者:太空狗 更新时间:2023-10-29 13:38:30 25 4
gpt4 key购买 nike

我有以下 git 存储库

  • repo
  • repo
  • repo

我 merge 成

  • repoAll,其中每个 repo 都被移动到一个子目录中

这看起来像

  • repo 全部
    • 目录
    • 目录
    • 目录

我已按照 http://jasonkarns.com/blog/merge-two-git-repositories-into-one/ 上的说明进行操作让这一切发生。这本质上意味着

git remote add -f repoA /path/to/repoA
git merge -s ours --no-commit repoA/master
git read-tree --prefix=dirA/ -u repoA/master
git ci -m "merging repoA into dirA"
...

因此,现在文件的历史记录不再连接,因为

git log --follow dirA/pom.xml

什么都不显示。

但是,

git log --follow pom.xml

确实显示该文件的正确(旧)历史记录。这还不够好,因为没有任何工具(如 eclipse 或其他 git 客户端)能够显示完整的历史记录。

更糟糕的是, merge 后的 repo 已经有新的提交,所以再次 merge 并不是一个真正的选择(我现在知道我应该将 repoA/* 移动到 repoA/dirA 在进行 merge 之前)。

我考虑过插入一个提交,该提交将在 repoAll 上的初始 merge 之前执行移动,但这需要我重新设置所有更改的基数(现在是 100+)并解决更改。

问题/解决方案Git log shows very little after doing a read-tree mergeHow can I rewrite history so that all files, except the ones I already moved, are in a subdirectory?似乎只适用于整个存储库,而不适用于特定的子目录(或者至少如果你已经在 repoAll 上有新的提交则不行)。

我认为应该有某种方法可以重写特定子目录(例如 dirA)的历史记录,但我似乎无法弄清楚该怎么做。

最佳答案

我最终用一个稍微费力的解决方案解决了这个问题,但它可能更简单

  1. 我记录了开发人员在 repoAll 上所做的第一次提交的 SHA1(因此是加入存储库后的第一次真正提交)。理想情况下,您创建一个分支以便能够再次找到它 ( git branch changes_start_here <SHA1> )
  2. 我再次从一个空的存储库开始,并重新克隆了各个存储库(repoA,...)
  3. 我去了 repoA 并添加了一个提交,我将 repoA 的所有内容移动到 dirA(仍在 repoA 上)

    cd repoA
    mkdir dirA
    git mv src pom.xml other* dirA (i.e. all contents except for dirA will be moved to dirA)
    git commit -m "moved repoA to dirA"

    对每个 repo 重复该操作

  4. 在新的(空的组合存储库)repoAllNew 上,我现在将所有本地存储库副本添加为远程

    cd repoAllNew
    git remote add -f origin-repoA ../repoA
    git pull origin-repoA master

    对每个 repo 重复

  5. 通过做类似的事情来确保历史是正确的

    git blame dirA/src/main/java/HelloWorld.java

    (显然,这必须是一个具有较长历史的现有文件)。检查那个 blame 包含每个源代码行的有意义的消息。

  6. 重新导入存储库 merge 后开发人员所做的所有更改。这可以通过将旧的 repoA 添加为远程来完成:

    git remote add -f origin-repoAllOld ../repoAll

    现在我们需要将加入存储库后所做的所有新更改 merge 到清理后的存储库中。

    git branch start <SHA1 of origin-repoAllOld/changes_start_here>
    git branch end <SHA1 of origin-repoAllOld/master>
    git rebase --onto master start end
  7. 现在您应该拥有与 repoA 相同的状态,但具有正确的历史记录。

管理总结

我们必须插入一个更改,将每个存储库的内容移动到相应的子目录中,然后再开始存储库迁移。这样,历史仍然是正确的,并且诸如 blame 之类的事情也能正常工作。恕我直言git read-tree --prefix ...应该避免,除非你想开始搞乱 git filter-branch (在 99% 的情况下你不想这样做)。

关于git - 将其他 repo merge 到子目录后修复损坏的 git 历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19385565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com