如何查看git子树的历史记录?

如何查看git子树的历史记录?,git,git-subtree,Git,Git Subtree,我有两个回购协议(我们称之为oldrepo1和oldrepo2)。这两份回购协议在其当前历史中分别有2万份和2万份承诺。我将它们合并到一个新的回购协议中,每一个都在一个子目录下: 新回购/旧回购1 新回购/旧回购2 我已经使用这些命令来填充新的repo git子树添加--message=“Migrate oldrepo1”--前缀=oldrepo1 master git子树添加--message=“Migrate oldrepo2”--前缀=oldrepo2 master 当我进入newrepo

我有两个回购协议(我们称之为oldrepo1和oldrepo2)。这两份回购协议在其当前历史中分别有2万份和2万份承诺。我将它们合并到一个新的回购协议中,每一个都在一个子目录下:

新回购/旧回购1

新回购/旧回购2

我已经使用这些命令来填充新的repo

git子树添加--message=“Migrate oldrepo1”--前缀=oldrepo1 master

git子树添加--message=“Migrate oldrepo2”--前缀=oldrepo2 master

当我进入newrepo的根目录并运行“git--no pager log--graph--oneline”时,我得到了41k个提交,正如预期的那样,但是如果我深入到下面的任何级别并运行git log,我得到的只是“Migrate oldrepoX”提交:

例如,我有一个文件在原始repo中有60个更改,但当我在新repo中的同一个文件上运行git log时,我得到的只是:

commit <commitid>
  Author: Me <me@myselfandi.com>
  Date:   Fri Sep 18 23:17:28 2020 -0700

      Migrate oldrepo1

      git-subtree-dir: oldrepo1
      git-subtree-mainline: <somecommitid>
      git-subtree-split: <somecommitid>
提交
作者:我
日期:周五9月18日23:17:28 2020-0700
迁移oldrepo1
git子树目录:oldrepo1
git子树主线:
git子树拆分:
迁移时我没有压缩任何历史记录,所以为什么我不能在新的repo中看到对该文件的60次提交

当我在同一个文件上运行git log时

您没有显示所使用的实际命令,但假设它是:

git log path/to/file.ext
或:

它们都做同样的事情。更一般地说,任何包含路径的
git log
命令都会执行此操作

这个问题被称为历史简化(参见)。最近(在中)有所改进,所以也要看到这一点。此历史简化只能通过重命名跟随单个文件或路径,将错过某些情况,通常需要使用
--follow
选项


Edit:我忘了提到
git subtree add
是一个特别困难的案例,即使是
--follow
也没有帮助(通常)。现有的
--follow
选项是一个非常可怕的黑客行为,确实需要被替换,但这已经发生了十多年,很难找到一个好的替换方法。

我选择了一种不同的方法,使用git filter repo将每个回购重新映射到子文件夹中,并将修改后的回购合并到新的回购中,正如x-yuri在本次讨论中所述:

详细情况如下:


我正在深入到树中,在一个特定的文件上运行git log:cd some/deep/path git log file.ext,它只给我使用--follow选项尝试过的子树提交,但没有得到任何输出,结果都是一样的:
git log file.ext
解析相对于存储库根的路径,因此,从那时起,它正在寻找一个名为
some/deep/path/file.ext
的文件。由于
git子树
以该路径读取文件,但早期提交具有不同的路径,因此文件名不相同。请记住,在Git中,文件名不是
file.ext
,而是
some/deepher/path/file.ext
,带有斜杠。
--follow
将检测其名称是否从一个提交更改为另一个提交,并尝试跟随新名称。这不会捕获所有案例。我还尝试了
git log--full history file.ext
,并获得了子树添加的相同单次提交。来自
git subtree add
的案例在这里特别困难,因此通常您无法在早期提交中看到该文件。要解决此问题,请修改
git日志
源代码,以便它能够检测此类情况,然后您将能够在早期提交中看到该文件。(这非常重要!)在原始存储库中(其提交现在位于组合存储库中),文件的路径名没有前缀。如果您要求git log查找该路径,它应该会找到该文件,但您只能看到那些以旧名称修改该文件的提交。
(cd path; git log to/file.ext)