git read-tree删除了所有历史记录

时间:2015-11-22 14:10:09

标签: git svn merge git-merge

我正在尝试使用git read-tree合并两个回购 问题是,合并文件的先前提交历史记录消失了。我明确地检查了文件。

我遵循这篇文章的正常方式进行子树合并:
6.7 Git Tools - Subtree Merging

$ 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存储库。这会影响读树行为吗?)

编辑:我尝试使用原始的Github repos,问题是一样的。

2 个答案:

答案 0 :(得分:4)

您描述的步骤不会将合并的历史记录添加为第二个父级。从链接中的文字看来,这似乎是他们的意图。由于您的意图不同,您应该稍微修改一下命令:

$ git remote add rack_remote git@github.com:schacon/rack.git
$ git fetch rack_remote

现在,首先启动合并。该命令使用&#34;我们的&#34;策略,所以它还没有真正改变任何东西。

$ git merge -sours --no-commit rack_remote/master

然后修改内容:

$ git read-tree --prefix=rack/ -u rack_remote/master

最后提交(将产生编辑器):

$ git commit

现在已经完成了:你有子目录中的合并文件及其历史记录。

这可能不是创建包含任意内容的合并提交的唯一方法,但第一种方法对我有用。另请注意,无需创建本地分支镜像rack_remote/master,您可以使用远程引用。

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

答案 1 :(得分:1)

您可以将两个repos合并为一个。即。

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 FETCH_HEAD