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
现在显示此提交。然后它继续,或者更确切地说,回到上一次提交,不管它是否显示了这一次提交,以及是否使用相同的规则显示该提交,依此类推。这可以通过两个大步骤完成。假设您有一个repoa
,其中包含要添加到其他repoB
上的文件:
git filter branch
创建repoa
的克隆,其中只包含要保留的文件的历史记录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的回答提供了过滤提交,这是提出不同问题的方法之一。这里的要点是,你必须找出你想要的问题,而不是盲目地选择一个最终可能毫无意义的答案。