我想让我原来的复杂问题变得更简单。
我在回购中有以下文件:
E:\\a\b\FooOld\foo.java
几周前,我使用新的 repo 将文件复制到了另一个目录:
E:\\c\d\FooNew\foo.java
有没有办法将 foo.java 的文件历史记录从旧仓库复制到新仓库?
它可以通过两个大步骤完成。假设您有一个存储库A
,其中包含要添加到不同存储库的文件B
:
git filter-branch
创建A
仅包含您要保留的文件历史记录的 repo 克隆。为此,如果您需要保留移动和重命名的历史记录,可以查看此答案,否则 Stack Overflow 上还有很多其他答案可以使用git filter-branch
. 或者您可以使用filter-repo,这似乎是一种更快、更简单的重写历史记录的方法。
重要提示:请记住git filter-branch
在您的 repo 的克隆上运行。我还建议git remote rm origin
在克隆上运行,这样就不会意外地将这个剥离版本推送到原点。
合并剥离A
成B
. 在 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
这实际上是不可能的,原因很简单,Git 中没有“文件历史”之类的东西。在 Git 中,历史只是所有提交的集合。如果添加提交,则添加历史记录。无论有什么提交,这些都是历史。而且,每个提交都代表了所有文件的完整快照(嗯,该提交中的所有文件,但这有点多余)。
您可以要求git log
向您展示修改某些特定文件的提交。它的工作方式是git log
遍历历史记录——向后,通过每次提交,一次一个,并将这次提交中的所有文件与前一次提交中的所有文件进行比较。 如果您好奇的一个特定文件发生了变化,git log
现在显示这个提交。然后它继续 - 或者更确切地说,返回 - 上一个提交,无论它是否显示了这个提交,并且显示或不显示使用相同规则的那个提交,等等。