Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 合并两个存储库(原始项目和无历史记录的更改项目)_Git_Version Control_Merge_Git Svn - Fatal编程技术网

Git 合并两个存储库(原始项目和无历史记录的更改项目)

Git 合并两个存储库(原始项目和无历史记录的更改项目),git,version-control,merge,git-svn,Git,Version Control,Merge,Git Svn,我有两个存储库: Gephi(大型开源项目)托管在github上 我公司基于gephi的项目 7个月前,当我们的项目启动时,有人在github上拍摄了gephi项目的快照,并将其保存到corporate svn=>change history loss 现在我决定将我们的项目移动到git存储库,并将更改与原始项目合并 我现在已经使用git svn从svn迁移了git存储库 我的文件在项目启动后没有更改历史记录 我可以将存储库的初始状态映射到原始存储库的状态吗?换句话说,我想开始将我们的更改应

我有两个存储库:

  • Gephi(大型开源项目)托管在github上
  • 我公司基于gephi的项目
7个月前,当我们的项目启动时,有人在github上拍摄了gephi项目的快照,并将其保存到corporate svn=>change history loss

现在我决定将我们的项目移动到git存储库,并将更改与原始项目合并

我现在已经使用git svn从svn迁移了git存储库

我的文件在项目启动后没有更改历史记录

我可以将存储库的初始状态映射到原始存储库的状态吗?换句话说,我想开始将我们的更改应用到原始存储库的特定版本中

更新:

今天我发现了另一个障碍。模式优先:

  • 红枝是原来的项目

  • 是主项目插件的提交(与
    中提交的代码无关)

  • 中添加了来自主项目(红色)存储库的代码
    (在每个提交中,三分之一的项目来自

我已将红色和蓝色存储库合并到一个存储库中。在第二个模式中,我有所需的状态。有可能这样做吗?(例如,make from
),然后将提交标记为合并自分支


谢谢朱利安的回复。这似乎很有帮助。

免责声明:我现在已经测试过了,它看起来像预期的那样工作(当然,假设我理解正确)。然而,仍然有很多地方可能出错绝对只能在项目存储库的单独工作副本上尝试此操作,并确保在将其推到任何位置之前检查所有内容。在执行此操作之前保留状态的完整目录备份。

所以我假设您有两个独立的存储库。原始项目(Gephi):

以及您的项目,其第一个版本看起来与原始项目的最后一个版本相同:

E'---V---W---Y---...---Z
                       ^ HEAD of your project
(可能有一些分支,但这在这里并不重要。)

您想要的(如果我理解正确的话)是:

你可以试试下面的方法再次强调,您可以独立完成此操作,分离工作树,并确保在将其推送到任何中央存储库之前,一切都正常

在您自己的工作树目录中,获取原始Gephi存储库的头和对象:

git fetch /path/to/original/gephi
如果尚未克隆Gephi存储库,那么最好指定github URL而不是本地文件系统路径

这将导致当前工作树出现以下情况:

A---B---C---D---E
                ^ FETCH_HEAD

E'---V---W---Y---...---Z
                       ^ HEAD
我们变化不大。目前,这两个头部和平共存,完全独立于彼此,但您现在可以从这两个存储库访问对象,并可以尝试组合它们

现在,我们希望放弃E'(它应该与E相同),而是使E成为项目第一次提交的父项,即V。为此,您可以使用
git过滤器分支

git filter-branch -f --parent-filter 'test $GIT_COMMIT = <V> && echo "-p <E>" || cat'

只需确保使用在这种情况下有意义的提交散列。

听起来您可能想要调查(或可能)——这些方法与
过滤器分支和
重基不同,它们添加元数据以更改存储库的可见状态,而不是重写历史来真正影响变化。当您有人使用现有分支时,这非常有用,因为它可以避免更改这些分支下的历史记录


在您的情况下,您希望为
E'
添加一个嫁接,将
E
作为额外的父项。

我刚刚测试了这个,它似乎有效(因此我更新了顶部的警告)。我仍然绝对建议您在一次性工作树上尝试此操作,并进行完整备份。很容易使
过滤器分支
语句出错,或者混淆哈希!如果本地项目有多个分支,或者如果历史记录中有任何合并,
git-rebase
不是正确的工具,因为它将线性化历史记录。请改用
过滤器分支
。谢谢。这是我最初的想法,但我认为rebase的语法更简单。我还原了更改,现在只再次提到筛选器分支。顺便问一下,有没有比使用
筛选器分支
更好的方法来更改单个提交的父级?对于这样简单的任务(如简单表达,而不是简单执行),必须指定shell脚本是很难的。@Julien:不,没有比
过滤器分支
更好的方法来重写父级。重写父级会更改每个子体提交的sha1 ID,这需要重写可能指向这些子体提交之一的标记和其他引用。本来可以编写一个单一用途的工具来简化这个特定任务,但是有太多其他重写任务具有类似的需求,因此开发人员认为最好有一个单一的难以使用但通用的工具(特别是因为重写非常罕见,因此痛苦是可以控制的)。我建议使用
git replace
而不是grafts——替换是引用,因此它们可以在存储库之间同步(使用适当的refspec)。是的,在很多情况下都是这样。然而,问题描述听起来像是git存储库刚刚开始(“现在我决定移动我们的项目[…]/我现在有了git存储库”),对于一个新的存储库,我更喜欢实际重写,而不是保留到时间结束的额外元数据。
A---B---C---D---E
                ^ FETCH_HEAD

E'---V---W---Y---...---Z
                       ^ HEAD
git filter-branch -f --parent-filter 'test $GIT_COMMIT = <V> && echo "-p <E>" || cat'
A---B---C---D---E---F---G---H---I
                ^               ^ FETCH_HEAD
                point where your project branched off

V---W---Y---...---Z
^                 ^ HEAD
first change based on E