如何将单个文件的历史记录从旧的 Git 存储库复制到新的存储库?

Hon*_*ong 5 git

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

我在存储库中有以下文件:

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 的文件历史记录从旧存储库复制到新存储库?

Rob*_*rto 9

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

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

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

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

  1. 合并剥离AB. 在 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


tor*_*rek 1

这实际上是不可能的,原因很简单,Git 中不存在“文件历史记录”这样的东西。在 Git 中,历史记录就是所有提交的集合。如果您添加提交,您就添加了历史记录。无论有什么承诺,这些都是历史。而且,每次提交都代表所有文件的完整快照(好吧,是该提交中的所有文件,但这有点多余)。

\n\n

可以要求git log显示修改某些特定文件的提交。其工作方式是git log沿着历史\xe2\x80\x94向后遍历每个提交,一次一个,换句话说\xe2\x80\x94,并将提交中的所有文件与上一个提交中的所有文件进行比较 如果您感兴趣的一个特定文件已更改,现在会显示这一提交。然后它移动到\xe2\x80\x94,或者更确切地说,返回\xe2\x80\x94到上一个提交,无论它是否显示了这个提交,并使用相同的规则显示或不显示提交,等等在。git log

\n

  • “实际上不可能”是不正确且无益的。显然“文件历史记录”存在于概念中,并且 git 拥有必要的信息;它知道每次提交时每个文件的状态,包括所做更改的日期/时间(正如您在“git log”中解释的那样)。如果您愿意在新存储库中重写历史记录,则可以在其他地方添加该文件及其所有更改。[下面罗伯托的回答](/sf/answers/4161406021/)提供了一些选项。 (2认同)