2

一个类似的问题How to cherry-pick multiple commits假设提交是连续的。

我有一个作为 tarball 下载的模块。我已将它包含在我的主项目的 git 存储库中并对其进行了更改。这些更改散布在主项目的其他提交中。

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

如何将每个单独的提交移到我的新仓库中?


我想我可以用cherry-pick来做到这一点,但这很耗时。这是我所拥有的:

使用主项目作为远程设置我的新存储库(这样我就可以挑选):

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" .

但是如果我运行脚本,就会出现合并冲突。在我解决合并和提交后,我需要从我的樱桃挑选脚本中删除成功的位并再次运行它。我想自动执行此操作,例如 git rebase。

4

4 回答 4

1

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

如果您现在没有时间,可以使用我的其他答案作为临时措施:)。

于 2011-06-13T19:43:04.327 回答
0

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

然后,将来,当您有更多时间时,可以使用我的其他答案来清理您的历史记录:)。

于 2011-06-13T19:49:05.213 回答
0

听起来git-subtree可能会这样做。这是开发人员的相关博客文章

于 2011-06-14T00:06:08.873 回答
0

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

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

来自git help filter-branch

--subdirectory-filter <directory>

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

于 2011-06-23T23:33:53.237 回答