我想让我原来复杂的问题变得简单得多。
我在存储库中有以下文件:
E:\\a\b\FooOld\foo.java
Run Code Online (Sandbox Code Playgroud)
几周前,我使用新的存储库将该文件复制到另一个目录:
E:\\c\d\FooNew\foo.java
Run Code Online (Sandbox Code Playgroud)
有没有办法将 foo.java 的文件历史记录从旧存储库复制到新存储库?
这是可以通过两大步骤完成的。假设您有一个存储库A,其中包含要添加到不同存储库的文件B:
git filter-branch存储库克隆。A为了实现这一点,如果您需要保留移动和重命名的历史记录,您可以查看这个答案,否则 Stack Overflow 上有很多其他答案可以使用git filter-branch. 或者您可以使用filter-repo,这似乎是一种更快、更简单的重写历史记录的方法。
重要提示git filter-branch:请记住在您的存储库的克隆上运行。我还建议git remote rm origin在克隆上运行,这样就不会意外地将这个剥离版本推送到原始版本。
合并剥离A成B. 在 repo 中B,执行以下操作:
2.1. B创建从到 的远程连接A:
git remote add repo-A <git repository stripped A directory>;
2.2. 使用选项拉取--allow-unrelated-histories。如果两个存储库都使用该master分支,则以下命令会将一个存储库合并到另一个存储库中:
git pull repo-A master --allow-unrelated-histories
2.3. 删除远程连接:
git remote rm repo-A
这实际上是不可能的,原因很简单,Git 中不存在“文件历史记录”这样的东西。在 Git 中,历史记录就是所有提交的集合。如果您添加提交,您就添加了历史记录。无论有什么承诺,这些都是历史。而且,每次提交都代表所有文件的完整快照(好吧,是该提交中的所有文件,但这有点多余)。
\n\n您可以要求git log显示修改某些特定文件的提交。其工作方式是git log沿着历史\xe2\x80\x94向后遍历每个提交,一次一个,换句话说\xe2\x80\x94,并将此提交中的所有文件与上一个提交中的所有文件进行比较。 如果您感兴趣的一个特定文件已更改,现在会显示这一提交。然后它移动到\xe2\x80\x94,或者更确切地说,返回\xe2\x80\x94到上一个提交,无论它是否显示了这个提交,并使用相同的规则显示或不显示该提交,等等在。git log