将git子树移动到不同的存储库中

我尝试将目录及其所有历史记录从存储库移动到另一个存储库.

使用git子树分割可以轻松提取目录的完整历史记录.

这将创建一个新分支,可以轻松地将其提取到其他存储库.

现在我使用git子树添加将目录粘贴回第二个存储库.

如果我看看gitk或git log –decorate –graph一切看起来都很好.所有提交都按预期存在.此外,所有文件都按预期存在.

但是当我尝试使用git log – transplanted_dir / somefile查看移植文件的历史时,我只看到一个“合并”提交,由git子树添加产生.

为什么我在上面的gitk中看到提交,而不是在单个文件的日志中?

如果我做一个简单的git合并,我可以看到每个文件的历史记录,但文件当然不会存在于子文件夹中.

将移动的提交集成到另一个存储库的正确方法是什么?

重现情况的详细示例命令:

#create two repositories:
git init a
git init b

# create directory dir with some history
cd a
mkdir dir
echo 1 > dir/file
git add .
git commit -am 1
echo 2 > dir/file
git commit -am 2
echo 3 > dir/file
echo 3 > otherfile
git add .
git commit -am 3

#split subtree
git subtree split --prefix dir -b split

#create a commit on repo b
cd ../b
mkdir otherdir
touch otherdir/file
git add .
git commit -am init

#fetch split branch of repo a
git fetch ../a split
git co -b split FETCH_HEAD
git log --decorate --graph --name-status 
git co master

# add commits to repo b
git subtree add --prefix somedir split

# this looks fine:
git log --decorate --graph --name-status

# no history here - Why?
git log --decorate --graph --name-status somedir/file
git log --decorate --graph --name-status --follow somedir/file

最佳答案 好吧,阅读消息来源清理了一切.

git子树添加非常难看:它首先使用git read-tree将当前版本添加到给定目录中,没有任何历史记录.之后,它使用git commit-tree创建一个虚假的合并提交来附加包含未加前缀文件的旧历史记录.

另一方面,现在HEAD上的前缀文件和HEAD ^ 2中未加前缀的文件应完全相同,并应通过–follow识别为移动.

不幸的是,它不被承认.不知道为什么.

最好的解决方案可能是添加一个显式提交,将文件移动到新目录并进行正常合并. – 另一种方法是重写移植目录的历史记录,如How can I rewrite history so that all files, except the ones I already moved, are in a subdirectory?中所述.

对于我的情况,git子树添加很糟糕,正常的git与正确准备的子树合并似乎是正确的.

点赞