我有以下git存储库
回购协议
回购
回购
我把它合并成
repoall,其中每个repo都被移动到一个subdir中
所以这看起来像
回购
迪拉
迪布
dirc公司
我已经按照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客户机)能够显示完整的历史记录。
更糟糕的是,合并回购已经有了新的提交,因此再次合并实际上不是一个选项(我现在知道,在合并之前我应该将repoA/*移动到repoA/dirA)。
我考虑过在repoall上的初始合并之前插入一个commit来执行移动,但这需要我重新平衡所有更改(现在是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?似乎只适用于整个存储库,而不适用于特定的subdir(或者至少在repoall上已经有了新的提交时不适用)。
我认为应该有某种方法来重写一个特定的subdir(如dira)的历史,但我似乎无法弄清楚如何重写。

最佳答案

我最后用一个更费力的解决方案来解决这个问题,但是它可能更简单。
我记录了开发人员在repoall上所做的第一次提交的sha1(因此是在加入存储库之后的第一次真正提交)。理想情况下,您创建一个分支以便能够再次找到它(git branch changes_start_here <SHA1>
我又从一个空存储库开始,重新克隆了单个存储库(repoa,…)
我去了repoa并添加了一个commit,在这里我将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"

对每个回购重复这个步骤
在新的(空的组合存储库)repoallnew上,我现在将所有本地存储库副本添加为remote
cd repoAllNew
git remote add -f origin-repoA ../repoA
git pull origin-repoA master

对每个回购重复
做些像这样的事情来确保历史是好的
git blame dirA/src/main/java/HelloWorld.java

(显然,这必须是一个有较长历史的现有文件)。检查一下
责怪包含每个源代码行的有意义的消息。
重新导入合并回购协议后开发人员所做的所有更改。
这可以通过将旧repoa添加为远程:
git remote add -f origin-repoAllOld ../repoAll

现在,我们需要合并在将repo合并到清理后的存储库中之后所做的所有新更改。
git branch start <SHA1 of origin-repoAllOld/changes_start_here>
git branch end <SHA1 of origin-repoAllOld/master>
git rebase --onto master start end

现在你应该拥有和repoa上一样的状态,但是有正确的历史。
管理概要
在开始repo迁移之前,我们必须插入一个将每个存储库的内容移动到相应子目录中的更改。这样的话,历史仍然是正确的,像责备之类的事情就行了。
除非你想开始捣乱,否则应该避免使用imhogit read-tree --prefix ...(99%的情况下你不想这样做)。

07-24 09:22