【发布时间】:2013-05-06 15:45:34
【问题描述】:
我尝试将目录及其所有历史记录从存储库移动到另一个存储库。
使用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
【问题讨论】:
-
当你移动一个文件时,你重命名它。我很确定没有参数的
git log会在重命名时停止;再往前看,该文件不存在。 -
不,没有重命名。 “合并”提交只是添加新文件。
-
@michas 将
foo/bar/baz移动到bar/baz算作重命名。git log --follow的输出是什么? -
不,--follow 也不起作用。请按照上面给出的情况设置,然后自己尝试。
标签: git git-subtree