提取部分git回购的git历史以创建git子模块——cherry pick?
类似的问题是,假设提交是连续的 我有一个作为tarball下载的模块。我已经将它包括在我的主要项目的git回购中,并对其进行了更改。这些更改与主项目的其他提交相互交错 我已经意识到我的方法的错误,并希望用git子模块替换该模块。我可以只添加当前状态,但我想保留我的git历史记录 我如何将每个单独的承诺转移到我的新回购协议中提取部分git回购的git历史以创建git子模块——cherry pick?,git,git-submodules,cherry-pick,Git,Git Submodules,Cherry Pick,类似的问题是,假设提交是连续的 我有一个作为tarball下载的模块。我已经将它包括在我的主要项目的git回购中,并对其进行了更改。这些更改与主项目的其他提交相互交错 我已经意识到我的方法的错误,并希望用git子模块替换该模块。我可以只添加当前状态,但我想保留我的git历史记录 我如何将每个单独的承诺转移到我的新回购协议中 我想我可以用cherry pick来做,但这很费时。以下是我所拥有的: 将主项目作为远程项目设置我的新回购协议(以便我可以选择): 我可以在主项目中通过git log~/.
我想我可以用cherry pick来做,但这很费时。以下是我所拥有的: 将主项目作为远程项目设置我的新回购协议(以便我可以选择): 我可以在主项目中通过
git log~/.vim/snippets
我可以做一个脚本来挑选
cd ~/.vim/snippets
git log --oneline --reverse --format="format:git cherry-pick %h #%s" .
但是如果我运行脚本,就会出现合并冲突。在解决合并和提交后,我需要从cherry pick脚本中删除成功的部分,然后再次运行它。我希望像git rebase一样自动执行此操作。您可能会发现
git筛选器分支
非常有用--如果您使用--tree filter
移动文件和--commit filter
删除对您的分支没有影响的提交,然后,您应该能够得到一个只包含子项目更改的分支
如果您现在没有时间,您可以使用我的另一个答案作为临时措施:)。如果您只需要历史记录,但不太关心是否有额外的数据,您可以创建两个分支,一个用于主代码,一个用于代码段。将代码段上移到其分支的顶层,删除其余文件。您应该发现,重命名跟踪允许您查看文件的历史记录,尽管您的历史记录中显然会有额外的文件和提交。然后,您可以使用此分支(可能克隆到单独的存储库)作为子模块 然后,在将来,当你有更多的时间时,你可以用我的另一个答案来清理你的历史:)。听起来你可能会这么做。以下是开发人员提供的信息。显示了一种更简单的方法:
git filter-branch --subdirectory-filter repo/subdirectory -- --all
从git help筛选器分支的
--子目录过滤器
只查看涉及给定子目录的历史记录。
结果将包含该目录(并且仅包含该目录)作为其
项目根。表示名为“重新映射到祖先”的部分
好啊我克隆了我的主repo,并使用过滤器分支清除不相关的文件。我想如果我想将我的更改应用于现有的回购协议,我可以将其添加为远程回购协议,并在其上重新设置基础。我使用了--prune empty
而不是--commit filter
,并做了一些重定基来删除旧的空合并提交。伟大的虽然我没有使用它,但我发现了使用过滤器分支的方法。
git filter-branch --subdirectory-filter repo/subdirectory -- --all