Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
提取部分git回购的git历史以创建git子模块——cherry pick?_Git_Git Submodules_Cherry Pick - Fatal编程技术网

提取部分git回购的git历史以创建git子模块——cherry pick?

提取部分git回购的git历史以创建git子模块——cherry pick?,git,git-submodules,cherry-pick,Git,Git Submodules,Cherry Pick,类似的问题是,假设提交是连续的 我有一个作为tarball下载的模块。我已经将它包括在我的主要项目的git回购中,并对其进行了更改。这些更改与主项目的其他提交相互交错 我已经意识到我的方法的错误,并希望用git子模块替换该模块。我可以只添加当前状态,但我想保留我的git历史记录 我如何将每个单独的承诺转移到我的新回购协议中 我想我可以用cherry pick来做,但这很费时。以下是我所拥有的: 将主项目作为远程项目设置我的新回购协议(以便我可以选择): 我可以在主项目中通过git log~/.

类似的问题是,假设提交是连续的

我有一个作为tarball下载的模块。我已经将它包括在我的主要项目的git回购中,并对其进行了更改。这些更改与主项目的其他提交相互交错

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

我如何将每个单独的承诺转移到我的新回购协议中


我想我可以用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