2

我想让我原来的复杂问题变得更简单。

我在回购中有以下文件:

E:\\a\b\FooOld\foo.java

几周前,我使用新的 repo 将文件复制到了另一个目录:

E:\\c\d\FooNew\foo.java

有没有办法将 foo.java 的文件历史记录从旧仓库复制到新仓库?

4

2 回答 2

5

它可以通过两个大步骤完成。假设您有一个存储库A,其中包含要添加到不同存储库的文件B

  1. 用于git filter-branch创建A仅包含您要保留的文件历史记录的 repo 克隆。

为此,如果您需要保留移动和重命名的历史记录,可以查看此答案,否则 Stack Overflow 上还有很多其他答案可以使用git filter-branch. 或者您可以使用filter-repo,这似乎是一种更快、更简单的重写历史记录的方法。

重要提示:请记住git filter-branch在您的 repo 的克隆上运行。我还建议git remote rm origin在克隆上运行,这样就不会意外地将这个剥离版本推送到原点。

  1. 合并剥离AB. 在 repoB中,执行以下操作:

    2.1。创建从B到的远程连接A

    git remote add repo-A <git repository stripped A directory>;

    2.2. 使用选项拉--allow-unrelated-histories。如果两个 repo 都在使用master分支,以下命令会将一个 repo 合并到另一个 repo:

    git pull repo-A master --allow-unrelated-histories

    2.3. 删除远程连接:

    git remote rm repo-A

于 2019-12-22T22:53:54.417 回答
1

这实际上是不可能的,原因很简单,Git 中没有“文件历史”之类的东西。在 Git 中,历史只是所有提交的集合。如果添加提交,则添加历史记录。无论有什么提交,这些都是历史。而且,每个提交都代表了所有文件的完整快照(嗯,该提交中的所有文件,但这有点多余)。

可以要求git log向您展示修改某些特定文件的提交。它的工作方式是git log遍历历史记录——向后,通过每次提交,一次一个,并将这次提交中的所有文件与前一次提交中的所有文件进行比较。 如果您好奇的一个特定文件发生了变化,git log现在显示这个提交。然后它继续 - 或者更确切地说,返回 - 上一个提交,无论它是否显示了这个提交,并且显示或不显示使用相同规则的那个提交,等等。

于 2018-12-17T18:21:00.757 回答