将git子树移动到另一个仓库中

5
我尝试将一个目录及其所有历史记录从一个存储库移动到另一个存储库。
使用git subtree split可以轻松提取完整的目录历史记录。
这会创建一个新分支,可以轻松地获取到其他存储库。
现在我使用git subtree add将目录粘贴回第二个存储库。
如果我查看gitkgit 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 命令只会停留在重命名的那个点;在更早的时间,那个文件是不存在的。 - matt
不,没有重命名。"合并"提交只是添加了新文件。 - michas
@michas 将 foo/bar/baz 移动到 bar/baz 被视为重命名。git log --follow 的输出是什么? - gcbenison
不,--follow也不起作用。请按照上述情况设置,并自行尝试。 - michas
1个回答

3

好的,阅读源代码解释了事情。

git subtree add非常丑陋:首先使用git read-tree将当前版本不带任何历史记录添加到给定目录中。然后使用git commit-tree创建一个假合并提交,以附加包含未前缀文件的旧历史记录。

另一方面,现在HEAD中的前缀文件和HEAD^2中的未前缀文件应该完全相同,并且应该被--follow识别为移动。

不幸的是,它没有被识别为这样。不知道为什么。

最好的解决方案可能是添加一个显式提交,将文件移动到新目录并进行正常合并。-另一种选择是根据如何重写历史记录,使所有文件(除了我已经移动的文件)都在子目录中?中所述重写移植目录的历史记录。

对于我的情况,git subtree add不好用,具有正确准备的子树的普通git merge似乎是完全正确的事情。


这里有一个非常相似的问题:https://dev59.com/QGgv5IYBdhLWcg3wBMEK - Maic López Sáenz
如果我有一个通过git subtree add创建的存储库,有没有办法恢复历史记录,以便git log正常工作? - oconnor0
"正确准备的子树"是什么意思?您可以在回答中添加命令/更改命令吗? - Aaron Digulla

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