我尝试将目录及其所有历史记录从存储库移动到另一个存储库。
提取目录的完整历史记录很容易,使用git subtree split
.
这将创建一个新分支,可以轻松地将其提取到另一个存储库。
现在我曾经git subtree add
将目录粘贴回第二个存储库。
如果我看gitk
或git log --decorate --graph
一切看起来都很好。所有提交都按预期存在。此外,所有文件都按预期存在。
但是当我尝试使用 . 查看移植文件的历史时git log -- transplanted_dir/somefile
,我只看到一个“合并”提交,由git subtree add
.
为什么我在上面的 gitk 中看到了提交,但在单个文件的日志中却没有?
如果我做一个简单的git merge
,我可以看到每个文件的历史记录,但这些文件当然不会存在于子文件夹中。
将移动的提交集成到其他存储库的正确方法是什么?
重现情况的详细示例命令:
#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