加入同一存储库旧版本的历史记录

2024-04-22

我有一个包含这段历史的存储库:

A---B---C---D

然后,这个存储库被“拆分”(基本上,使用 git-subtrees 创建了另一个存储库,其历史记录从“D”开始)。

现在,我有另一个具有这段历史的存储库:

# The same D as the other
D---E---F---G

如何将同一项目故事情节的这两个“部分”加入到一个存储库中?
最终结果必须是:

A---B---C---D---E---F---G

我已经尝试了很多方法,但所有这些都包括合并,但这不是我想要的,因为合并不会保留一些更改,例如已删除的文件。
另外,我尝试为存储库最后一个版本的所有更改生成补丁并将其应用到旧版本中,但得到了很多error: <file> already exists in index errors.

Update

I found 这另一个问题 https://stackoverflow.com/questions/3810348/setting-git-parent-pointer-to-a-different-parent关于重新调整提交的父级,这正是解决我的问题的方法,两者的结合git replace --graft and git filter-branch.

Update 2

现在我的任务已经完成,我发布了以下问题的完整、正确答案。


更新 - 实际完美的方法:

准备

# Inside the older repo
$ cd old_repo

# Add the remote to newer repo with updated content
$ git remote add <remote name> <new_repo>

# Fetch the remote
$ git fetch <remote name>

# Track all branches of the remote so you have all of it's history in your older git (be aware of the remote's name in the command)
$ for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##<remote name>/} $b; done

# Delete the remote so you avoid messing up with the newer repo
$ git remote remove <remote name>

现在,我强烈建议您对这个存储库使用可视化工具(例如 Gitkraken),因为现在它有点混乱。您将拥有两个彼此独立的历史记录,并且可能存在大量重复提交。

现在,选择将被操纵的提交。让我们用哈希调用提交A较旧历史记录中的一个,现在将成为该提交的父级B的最新历史。现在,您可以使用下面的脚本(或手动运行命令)来加入树并清理留下的混乱(在提交时修剪较新的历史记录)B,丢弃所有父母,因为现在它有一个新的父母)。
(你必须有 git-replace 和git-过滤器-repo https://github.com/newren/git-filter-repo已安装)

#!/bin/sh

# Argument "$1" is commit A, and argument "$2" is commit B of the explanation above

if [ -z "$1" ] || [ -z "$2" ]
then
        echo "You must provide two commit hashes for this script";
        exit 1;
fi

git replace --graft $1 $2
result="$?"

[ "$result" = "0" ] && git filter-repo --force

旧的,不重要(这只是为了学习不该做什么),请在下面回答。

首先我尝试了该方法git-rebase,由于多种原因,这并没有成功,最大的一个是,对于像将提交的父级更改为另一个提交这样的事情来说有点矫枉过正,即使它与历史无关。
然后我尝试了git cherry-pick重新应用从点开始的所有历史记录E..G到旧存储库,由于多种原因也不起作用,但主要原因是它没有递归复制其他分支。

尝试过的方法

$ git replace --graft <commit> <new parent to this commit>
现在,把HEAD在新历史记录的顶端(您想要保留的主线中的最新提交),然后:
$ git filter-branch <new parent to this commit>..HEAD

您可能会松散尚未合并到 HEAD 所在分支的分支,但我暂时找不到解决方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加入同一存储库旧版本的历史记录 的相关文章

随机推荐

  • 关于 jsch 中 sudo su - 用户的想法

    我在 jsch 中使用 sudo su 时遇到问题 下面是我的帖子 exec java package com test import com jcraft jsch import java awt import javax swing i
  • SQL Server返回代码-6,是什么意思?

    我有一个没有任何问题的存储过程 即返回代码为 0 在某些情况下 我会引发用户定义的错误 gt 50000 在这些情况下 回报是 6 我只是好奇 6 是什么意思 我没有在程序中设置返回码 因此这个数字是SQL Server 系统 生成的 我发
  • build.xml 将日期和时间设置为文件名

    我想设置带有日期和时间的文件名 因此我想创建名为的文件behat 20140913 195915 html但是下面的示例将名称设置为behat yyyymmdd hhiiss html 有人知道问题的解决办法吗 我跟着这个例子 http a
  • 带功能区的 Spring Cloud 不会忽略关闭的服务器

    我正在遵循有关尤里卡客户端负载平衡的 Spring 指南 https spring io guides gs client side load balancing https spring io guides gs client side
  • 如何从ajax加载数据到zabuto日历插件?

    作为标题 我尝试将数据从 ajax 加载到 zabuto 日历 但似乎不起作用 参考 zabuto 日历http zabuto com dev calendar examples show data html 我想在单击上个月或下个月的导航
  • 日历应该用表格来表示吗?为什么 Google 日历只使用表格作为列?

    这不是另一个一般的 一般布局的表格与 div 元素 类型的问题 例如 为什么不使用表格来布局 https stackoverflow com questions 83073 why not use tables for layout in
  • Rails:如何增加模型选定实例的整数字段?

    Buyer模型有两个字段 名称 字符串 位置 整数 我想增加position在所有买家中position gt N 最简单的方法是什么 是否可以仅使用一个查询来实现这一目标 你可以使用 Buyer update all position p
  • FireStore 创建一个文档(如果不存在)

    我想更新这样的文档 db collection users doc user id update foo bar 但是 如果文档 user id 不存在 上面的代码将抛出错误 因此 如果学生不存在 如何告诉 Firestore 创建学生 换
  • 当 JUnit 5 外部测试用例失败时,不要启动嵌套测试用例

    我有以下测试类 import org junit jupiter api Nested import org junit jupiter api Test import org junit jupiter api TestInstance
  • Rails 5.1 路由:动态:动作参数

    Rails 5 0 0 beta4 在包含动态 action 和 controller 段的路由上引入了弃用警告 DEPRECATION WARNING Using a dynamic action segment in a route i
  • 如何突出显示Recycler View中选定的Item?

    我有一个回收站视图 其中包含从内部存储加载的图像 我想在单击时突出显示所选项目 我尝试了很多东西但没有成功 实际上 我需要的是 当我单击回收器视图中的任何项目时 该项目必须进入我的ArrayList 并且它也应该突出显示 并且当我单击或取消
  • Sklearn 随机森林回归器的错误

    当尝试使用 y 数据拟合随机森林回归器模型时 如下所示 0 00000000e 00 1 36094276e 02 4 46608221e 03 8 72660888e 03 1 31375786e 04 1 73580193e 04 2
  • 如何从 iPhone 中删除 coredata

    您知道当您更改实体结构时如何重置 iPhone 模拟器上的核心数据存储吗 当我创建的核心数据存储的新版本与我上次在 iPhone 上运行的版本不同时 是否需要执行类似的过程 如果可以的话 请问如何 Thanks 只是为了方便起见 除非您编写
  • CMS 在 .NET 中使用不在本地受信任证书存储中的证书链进行签名

    我有存储在网络上的 X509 证书 我可以从远程 Windows 证书存储中读取链 我需要签署一些数据并将链包含到签名中 以便以后可以对其进行验证 问题是我找不到将证书链放入 CsmSigner 的方法 我读到它从构造函数参数中获取证书并尝
  • PostgreSQL:“按分钟”运行查询的行数

    我需要每分钟查询截至该分钟的总行数 到目前为止我所能达到的最好成绩并不能解决问题 它返回每分钟的计数 而不是每分钟的总计数 SELECT COUNT id AS count EXTRACT hour from when AS hour EX
  • Python BigQuery 超时确实很奇怪

    我正在构建一项将数据流式传输到 bigquery 的服务 如果我删除需要 4 5 分钟加载的部分 我正在预缓存一些映射 则以下代码可以完美运行 from googleapiclient import discovery from oauth
  • Ruby 2.3 - 向 net:http 请求添加超时错误和通知

    我有一个工作系统可以产生错误并将其发送给活动管理员使用 例如 在活动管理中 对于我们 CMS 的特定页面 该页面可能会执行 url must be accessible http www exmaple com field url part
  • 使用 stack 安装 shuffle 库时出错

    Using stack 1 2 0 and LTS 7 0我在安装时遇到以下错误shuffle https hackage haskell org package shuffle 图书馆 cabal get shuffle cd shuff
  • 滚动时删除#anchor-id

    我正在使用这个jqueryhttp css tricks com examples SmoothPageScroll http css tricks com examples SmoothPageScroll 创建平滑的页面滚动 但是每次我
  • 加入同一存储库旧版本的历史记录

    我有一个包含这段历史的存储库 A B C D 然后 这个存储库被 拆分 基本上 使用 git subtrees 创建了另一个存储库 其历史记录从 D 开始 现在 我有另一个具有这段历史的存储库 The same D as the other