【问题标题】:How to view history of git subtree?如何查看 git 子树的历史记录?
【发布时间】:2020-10-13 15:21:24
【问题描述】:

我有两个存储库(我们称它们为 oldrepo1 和 oldrepo2)。这两个存储库在其当前历史记录中分别有 20k 和 21k 次提交。我将它们合并到一个新的仓库中,每个都在一个子目录下:

newrepo/oldrepo1

newrepo/oldrepo2

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

git subtree add --message="Migrate oldrepo1" --prefix=oldrepo1 <oldrepo1 url> master

git subtree add --message="Migrate oldrepo2" --prefix=oldrepo2 <oldrepo2 url> master

当我进入 newrepo 的根目录并运行“git --no-pager log --graph --oneline”时,正如预期的那样,我得到了 41k 次提交,但是如果我深入到下面的任何级别并运行 git log我得到的只是“迁移 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>

我在迁移时没有压缩任何历史记录,为什么我在新的 repo 中看不到这个文件的 60 次提交?

【问题讨论】:

    标签: git git-subtree


    【解决方案1】:

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

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

    git log path/to/file.ext
    

    或:

    (cd path; git log to/file.ext)
    

    两者都做同样的事情。更一般地,任何包含 pathgit log 命令都会执行此操作。

    有问题的 this 称为历史简化(请参阅Git log history simplification, elaborations example in git log's manual)。 The git log documentation 最近得到了改进(在 commit 8d049e182e2e... 中),所以也请参阅。这种历史简化只能通过重命名跟踪单个文件或路径,会遗漏某些情况,通常需要使用--follow 选项。

    编辑:我忘了提到git subtree add 是一个特别困难的情况,即使--follow 也无济于事(通常)。现有的 --follow 选项是一个可怕的 hack,确实需要被替换,但这已经存在十多年了,一个好的替换是hard

    【讨论】:

    • 我正在深入树并在特定文件上运行 git log: cd some/deeper/path git log file.ext 这只给我我尝试使用 --follow 的子树提交选项,根本没有输出
    • 结果都是一样的:git log file.ext 解析相对于存储库根目录的路径,因此从那时起它正在寻找一个名为 some/deeper/path/file.ext 的文件。因为git subtree 在该路径中读取文件,但较早的提交具有不同的路径,所以文件名不同。请记住,在 Git 中,该文件的名称不是 file.ext,而是名称为 some/deeper/path/file.ext,并带有斜杠。 --follow 将检测其名称是否从一个提交更改为另一个,并尝试遵循新名称。这不会涵盖所有情况。
    • 我也尝试了git log --full-history file.ext,并为子树添加获得了相同的单个提交。
    • git subtree add 的案例在这里特别困难,因此通常您将无法在早期提交中看到该文件。要解决此问题,请修改git log 源代码,以便它可以检测到这种情况,然后您将能够在早期提交中看到该文件。 (这是非常重要的!)
    • 如何向 git log 询问该路径? 这是 64,000 美元(100 万美元?)的问题。今天没有办法做到这一点。 Git 存储库中的历史记录是存储库中的一组提交。答案就在里面。没有办法要求它。但是,如果您知道答案,请使用git log &lt;options&gt; -- &lt;historic-path&gt;-- 告诉 Git:其余的是路径名。否则,Git 会尝试猜测这是修订版还是路径,并且它不能作为 基于当前提交的任何一个。
    【解决方案2】:

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

    How to import existing Git repository into another?

    此处详细说明:

    https://gist.github.com/x-yuri/6161d90d1af8ebac6e560bcef548c1c3

    【讨论】:

      猜你喜欢
      • 2010-12-19
      • 2018-11-01
      • 2012-08-10
      • 2016-10-20
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 2010-12-12
      相关资源
      最近更新 更多