Git 如何复制单个文件';从旧的吉特回购到新的回购的历史?

Git 如何复制单个文件';从旧的吉特回购到新的回购的历史?,git,Git,我想让事情简单得多 我在回购协议中有以下文件: E:\\a\b\FooOld\foo.java 几周前,我用一个新的repo将文件复制到另一个目录: E:\\c\d\FooNew\foo.java 有没有办法将foo.java的文件历史记录从旧的repo复制到新的repo?这实际上是不可能的,原因很简单,Git中没有“文件历史记录”这样的东西。在Git中,历史只是所有提交的集合。如果添加提交,则添加历史记录。不管发生了什么,这就是历史。而且,每次提交都代表所有文件的完整快照(好吧,提交中的所

我想让事情简单得多

我在回购协议中有以下文件:

E:\\a\b\FooOld\foo.java
几周前,我用一个新的repo将文件复制到另一个目录:

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

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

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


您可以要求git log显示修改某些特定文件的提交。其工作方式是,
git log
在历史记录中向后追踪,每次提交一个,换句话说,将本次提交中的所有文件与上一次提交中的所有文件进行比较。如果您感兴趣的某个特定文件已更改,
git log
现在显示此提交。然后它继续,或者更确切地说,回到上一次提交,不管它是否显示了这一次提交,以及是否使用相同的规则显示该提交,依此类推。

这可以通过两个大步骤完成。假设您有一个repo
a
,其中包含要添加到其他repo
B
上的文件:

  • 使用
    git filter branch
    创建repo
    a
    的克隆,其中只包含要保留的文件的历史记录
  • 要实现这一点,您可以查看是否需要保留移动和重命名的历史记录,否则在堆栈溢出方面还有很多其他答案,它们使用
    git filter branch
    以更简单的方式实现。或者您可以使用,这似乎是一种更快更简单的方法来重写历史

    重要信息:记住在回购协议的克隆上运行
    git过滤器分支
    。我还建议在克隆上运行
    git remote rm origin
    ,这样就不会意外地将这个剥离版本推送到origin

  • 将剥离的
    A
    合并到
    B
    。在回购
    B
    中,执行以下操作:

    2.1。创建从
    B
    a
    的远程连接:

    git远程添加repo-A

    2.2。使用选项
    --允许不相关的历史记录
    进行拉取。如果两个回购协议都使用
    分支,则以下命令将一个回购协议合并为另一个回购协议:

    git pull repo-A master——允许不相关的历史记录

    2.3。删除远程连接:

    git远程rm回购-A


  • 否,“历史记录”不属于该文件,它属于repo/commit。在repo之间移动“文件的历史记录”是没有意义的,因为它不属于它所属的repo文件,GIT提交是整个repo的完整副本,没有任何文件更改谢谢您的帮助。“合并”一词是否更合适?换句话说,repo A的foo.java文件的历史记录是否可以与repo B的foo.java文件的历史记录合并?否,不能合并文件(句号)。您可以合并回购协议,但不能合并回购协议中的文件。合并发生的最低级别是回购,没有低于此级别的内容。谢谢您的进一步说明。我已经接受了与你的评论一致的答案。谢谢。正如你所说,当我把历史看作是一系列的承诺时,我很容易理解其中的原因。理论上,可以比较旧foo.java的最新版本和新foo.java的原始版本,看它们是否不同,看是否需要进行提交来链接它们,然后两个repo的提交可以链接在一起(即合并)。对:如果您有所有旧提交和所有新提交,以及它们之间的合并,Git将遍历这两组提交。这里有一个烦恼,因为
    git log
    (特别是,
    git log--follow
    )在回顾这两段历史时并不是很聪明,但有一天
    git log
    可能会更聪明。“字面上不可能”是不正确的,也没有帮助。显然,“文件历史”在概念上存在,git拥有必要的信息;它知道每次提交时每个文件的状态,包括所做更改的日期/时间(正如您在git log上解释的那样)。如果您愿意在新的回购协议中重写历史记录,您可以将该文件及其所有更改添加到其他位置。提供一些选项。@gens:不,特定的文件历史记录实际上不存在。您从git log中得到的答案取决于您的提问方式。您可以声称同时存在多个不同的概念文件历史记录,但这无助于解决问题。Roberto的回答提供了过滤提交,这是提出不同问题的方法之一。这里的要点是,你必须找出你想要的问题,而不是盲目地选择一个最终可能毫无意义的答案。