如何在旧版本的旧 .tar.gz 存档之上重新构建新代码?

Posted

技术标签:

【中文标题】如何在旧版本的旧 .tar.gz 存档之上重新构建新代码?【英文标题】:How can I rebase my new code atop of old .tar.gz archives of old versions? 【发布时间】:2021-12-16 16:05:09 【问题描述】:

我正在开发一个项目,其中原始开发人员为每个新版本创建了 .tar.gz。我获取了最新版本,将其放入 .git,并在其上添加了我的补丁。

在过去几个月的多次提交和更改之后,老开发者要求我成为维护者并将其放在 github 上。我想要 rebase 以便所有旧的 .tar.gz 版本作为一个提交存在,然后将我的提交放在这些提交之上,以将旧版本保留在 git 历史记录中,但保留我现有的提交历史记录。

(因为这是有史以来第一次通过 git 公开推送的提交,所以我不在乎用 rebase 破坏 git-hash 历史记录。)

这个解释有两个 .git 树:具有单次提交 .tar.gz 的旧历史树,我称之为“历史”,另一个我称之为“新”,我的提交需要显示在所有历史之上提交。为此,我尝试了以下方法:

第 1 部分,准备历史树:

    git init 启动了一个历史.git 树 使用 cmets 一次提交一个 .tar.gz 以进行发布

第 2 部分,尝试将历史树重新定位为远程:

    在“新”树上我做了一个git remote add historical /path/to/historical-tree 使用git checkout -b before-historical-rebase 前往临时测试分支 试过git rebase historical 有很多合并冲突标记为“都已修改”和一些“被我删除”

我认为自从最后一个 .tar.gz 的结尾与我第一次提交的开始相同,这将是干净的,但是我在最后一个 .tar.gz 版本的边界的提交历史和我的第一个commit 没有我想象的那么干净,或者有更好的方法来做到这一点。

你会如何处理这个问题?

【问题讨论】:

【参考方案1】:

如果我理解正确:

您的本地开发历史如下所示:
* eacfdd14 (HEAD -> master) commit
* eabddd13 commit
* eaacdd12 commit
* ea0bdd11 2.2 latest version from tar.gz
并且你想重新设置它:
* cd22dfaf (historical) 2.2 latest version from tar.gz
* cd21dfae 2.1 version from tar.gz
* cd20dfad 2.0 version from tar.gz
* cd11dfac 1.1 version from tar.gz
* cd10dfab 1.0 first version from tar.gz

为避免重播您最初的“来自 tar.gz 的 2.2 最新版本”提交,请使用 git rebase 和以下参数:

git rebase --onto historical ea0bdd11 master

【讨论】:

原来作者的 .tar.gz 比我所基于的新的 .tar.gz 是我的提交和他的混合。我最终对我所有的旧提交和修复的冲突进行了挑选。

以上是关于如何在旧版本的旧 .tar.gz 存档之上重新构建新代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不包含父目录的 Python/tar 中创建 tar.gz 存档?

在没有 exec 的情况下创建 zip 或 tar.gz 存档

如何使用 bash 从 tar.gz 存档中列出目录大小

如何在不解压缩内容的情况下查看 .tar.gz 存档中特定文件的内容?

使用 SharpZipLib 制作没有文件夹结构的 .tar.gz 存档

如何解压缩另一个目录中的 tar.gz