Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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 - Fatal编程技术网

梳理Git存储库,保存历史和参考

梳理Git存储库,保存历史和参考,git,Git,我有几个Git回购,我想合并成一个。我在网上找到了几篇文章,比如 他们通过远程获取不同repo的提交图 然而,通过查看这些步骤,似乎可以看出,尽管提交历史记录被保留,但引用却没有 我想要的是: 假设我有两个回购,foo和bar 我希望它们的历史记录存在于合并的回购协议中 在新的combinedrepo中,我希望能够以foo/作为后缀引用foo中的现有分支和标记。因此,如果在foo和bar中都有相同的标签v1.0,则在组合repo中它将变成foo/v1.0和bar/v1.0 我正在考

我有几个Git回购,我想合并成一个。我在网上找到了几篇文章,比如

他们通过远程获取不同repo的提交图

然而,通过查看这些步骤,似乎可以看出,尽管提交历史记录被保留,但引用却没有

我想要的是:

  • 假设我有两个回购,
    foo
    bar
  • 我希望它们的历史记录存在于
    合并的
    回购协议中
  • 在新的
    combined
    repo中,我希望能够以
    foo/
    作为后缀引用
    foo
    中的现有分支和标记。因此,如果在
    foo
    bar
    中都有相同的标签
    v1.0
    ,则在
    组合
    repo中它将变成
    foo/v1.0
    bar/v1.0
我正在考虑这种方法,并希望与专家澄清,以确保其有效:

  • 在本地克隆
    foo
    bar
    repos,并提取标记
  • 使用初始提交创建新的
    组合的
    存储库
  • foo
    bar
    .git/objects
    复制到
    combined/.git/objects
    (这将把
    foo
    bar
    的所有blob、tree和提交带到
    combined
    对吗?)
  • foo/.git/refs/remotes/origin/*
    复制到
    combined/.git/refs/heads/foo/*
    。对
    foo/.git/refs/tags/*
  • bar
    存储库重复4次
  • foo
    bar
    的更新
    .git/refs
    .git/logs/refs/heads
    (不包括
    .git/logs/refs/remote
    )复制到
    组合的
  • foo/master
    合并到
    master
    ,并将所有内容移动到
    foo/
  • 条执行相同操作

  • 在我看来,它会起作用,但我担心我可能忽略了一些可能会破坏存储库的东西,这就是我在这里征求意见的原因。

    使用遥控器和执行
    git
    命令将帮助您避免逆向工程陷阱

    例如:somme引用实际上存储在
    .git/packed refs
    中,您不应该忘记考虑它们

    (现在,这一点已经概述,问题在于找出我们没有概述的其他要点;)


    您可以将
    foo
    remote(resp.
    bar
    )的refspec编辑为类似
    +refs/*:refs/foo/*
    (resp.
    +refs/*:refs/bar/*
    )的内容

    或者更确切地说:

    +refs/heads/*:refs/heads/foo/* # map foo branches to local branches named 'foo/*'
    +refs/tags/*:refs/tags/foo/*   # map foo tags to local tags named 'foo/*'
    
    然后简单地运行
    git fetch
    ,您应该已经接近好了



    这不会保留每个分支的reflog,您可能需要在此处进行一些手动操作。

    当然,我可以按照问题中链接中的建议使用reomte,并使用脚本逐个重命名每个分支/标记,然后对下一个远程分支/标记执行相同操作。然而,这对我来说似乎很麻烦。如果我像上面所想的那样操作
    .git
    ,会有什么问题?只是:使用官方api(例如
    git
    命令)会比反向工程实现产生更少的bug。例如:使用
    git clone/git fetch
    可确保
    git
    实际列出所有引用(例如,一些存储在
    packed refs
    中)(供您更新)
    refs/remotes/foo
    的存在毫无意义,因为一旦我发布此repo供我们的团队使用,他们不会有和我的组合遥控器一样的遥控器。我希望能够将原始存储库的标记/分支放在新的组合存储库中,这是打包引用的良好点。似乎找不到捷径…:(谢谢(我一直在寻找一种合适的方法来做你想做的事情):对每个遥控器使用REFSEC