Git read-tree命令删除了所有历史记录

3
我正在尝试使用 git read-tree 合并两个仓库。
问题是,合并后的文件的先前提交历史消失了。我显然已经逐个文件检查过了。
我按照这篇文章中描述的常规子树合并的方法进行操作:
6.7 Git 工具 - 子树合并
$ git remote add rack_remote git@github.com:schacon/rack.git
$ git fetch rack_remote
$ git checkout -b rack_branch rack_remote/master
$ git read-tree --prefix=rack/ -u rack_branch

我的当前工作空间结构如下:

project P
   - repoA
   - repoB
   - repoC
   (... and many more repos)

我想要改变它们的层次结构,使其变成以下形式:
project P
   - repoA <=== have repoB and repoC inside.
我无法在上面的示例中以及我的git log结果中看到合并文件的历史记录。
(我想强调我的存储库是从svn克隆的,仍然链接到svn存储库。这会影响read-tree的行为吗?)

编辑:我尝试了原始的Github存储库,问题仍然存在。


这两个仓库是否有共同的祖先?如果是,为什么需要进行树合并? - mb21
@mb21,您所说的祖先是什么意思?它们在项目中,但是在不同的存储库中。我想重新组织项目,将所有内容(包括历史记录)移动到一个地方。 - NaHeon
@honey,“共同祖先”是指存在于两个存储库中的提交,通常在历史的早期,例如如果这两个存储库最初作为一个存储库开始。听起来答案是否定的。 - Chris
@Chris 我明白了。不是的 :) - NaHeon
read-tree 只是将快照读入工作副本,它不知道历史记录。 - kan
每个文档都说read-tree会保留历史记录,我猜是这样的。 - NaHeon
2个回答

7
你所描述的步骤没有将合并后的历史记录添加为第二个父级。从链接中的文本来看,似乎这是他们的意图。由于你的意图不同,你应该稍微修改一下命令:
$ git remote add rack_remote git@github.com:schacon/rack.git
$ git fetch rack_remote

现在,首先要启动合并。该命令使用“ours”策略,因此它现在不会真正改变任何内容。
$ git merge -sours --no-commit rack_remote/master

然后修改内容:
$ git read-tree --prefix=rack/ -u rack_remote/master

最后提交更改(将生成编辑器):

$ git commit

现在已经完成了:您可以在子目录中找到已合并的文件以及它们的历史记录。

这可能不是创建具有任意内容的合并提交的唯一方法,但是对我有效的第一种方法。还要注意,无需创建反映rack_remote/master的本地分支,您可以使用远程引用。

PS:您需要使用--follow来跟踪文件历史记录,因为合并会重命名它们。


我确切地按照每一步骤进行了操作,尽管有些步骤被跳过了。无论如何,感谢“--follow”选项。看起来GitHub并没有使用此选项来显示文件的历史记录。 - NaHeon

3
您可以将两个仓库合并为一个。例如:
git clone repoB
cd repoB
mkdir b_proj_dir
git mv * b_proj_dir/
git commit -m "move b to subfolder"

cd ..
git clone repoA
cd repoA
git fetch ../repoB
git merge --allow-unrelated-histories FETCH_HEAD

这绝对是对我来说最容易的方法。我怀疑许多人在这条路上走下去时会感到困惑,当他们认为他们的 git 日志历史消失了,而实际上它仍然存在,只是他们没有使用 --follow 选项查看移动 repoB 内容到子目录之前的历史记录。在使用 git svn 将我的源代码库克隆到 repoB 中后,我将其移动到所需的项目子目录中,然后执行了上述操作以将其合并到我的最终托管库 repoA 中。实际的操作仅花费了几分钟的时间。唯一需要调整的是:必须在最后的 git 合并中添加 "--allow-unrelated-histories" 选项。 - user447688
这对我不起作用。我得到了“fatal: refusing to merge unrelated histories”的错误。有什么想法吗? - xioxox
啊,显然是 --allow-unrelated-histories - xioxox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接