为git repo的一部分提取git历史,以创建git子模块cherry-pick



一个类似的问题,如何挑选多个提交,假设提交是连续的

我下载了一个模块作为tarball。我已经将它包含在我的主项目的git repo中,并对其进行了更改。这些更改穿插在主项目的其他提交中。

我已经意识到了我的方法的错误,并希望用git子模块替换该模块。我可以添加当前状态,但我想保留我的git历史记录。

如何将每个承诺转移到我的新回购中?


我想我可以用樱桃采摘,但这很耗时。这是我的:

将我的新回购与主项目设置为远程(这样我就可以挑选):

cd ~/snippets
git remote add main ~/.vim/
git fetch main

我可以在git log ~/.vim/snippets 的主项目中看到相关的提交

我可以用制作一个脚本

cd ~/.vim/snippets
git log --oneline --reverse --format="format:git cherry-pick %h #%s" .

但是如果我运行脚本,就会出现合并冲突。在我解决了合并和提交之后,我需要从我的cherry-pick脚本中删除成功的部分,然后再次运行它。我想像git rebase一样自动完成此操作。

您可能会发现git filter-branch很有帮助——如果您使用--tree-filter来移动文件,使用--commit-filter来删除对分支没有影响的提交,那么您最终应该能够得到一个只包含子项目更改的分支。

如果你现在没有时间,你可以用我的另一个答案作为临时措施:)。

如果你只想要历史记录,但不太关心那里是否有额外的数据,你可以创建几个分支,一个用于主代码,另一个用于片段。将代码段向上移动到其分支的顶层,删除其余文件。您应该会发现,重命名跟踪允许您查看文件的历史记录,尽管您的历史记录中显然会有额外的文件和提交。然后,您可以使用这个分支(可能克隆到一个单独的存储库)作为您的子模块。

然后,在未来,当你有更多的时间时,你可以用我的另一个答案来清理你的历史:)。

听起来git子树可能会这么做。这是开发人员的一篇相关博客文章。

这个问题显示了一种更简单的方法:

git filter-branch --subdirectory-filter repo/subdirectory -- --all

来自git help filter-branch:

--subdirectory-filter <directory>

只查看涉及给定子目录的历史记录。结果将包含该目录(并且仅包含该目录)作为项目根。暗示称为"重映射到祖先"的部分。

相关内容

  • 没有找到相关文章

最新更新