一个类似的问题,如何挑选多个提交,假设提交是连续的
我下载了一个模块作为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>
只查看涉及给定子目录的历史记录。结果将包含该目录(并且仅包含该目录)作为项目根。暗示称为"重映射到祖先"的部分。