ELL*_*BLE 5 git merge repository
这里有很多关于将文件夹从一个存储库移动到新存储库的帖子git filter-branch; 我需要做的是将单个文件移动到新的存储库中.
我已经创建了新的存储库,并将文件系统中的旧存储库添加为"远程",并创建了一个新的"根提交"(只需为新的单文件项目添加自述文件).现在我需要移植与此特定文件有关的提交到新的root-commit上.
(我应该提一下,这个文件在任何时候都没有像任何其他文件一样被修改;我怀疑这可能会使这个任务变得更容易.)
这基于filter-branch手册页中的示例:
git filter-branch --index-filter 'git ls-files -s | grep $'\t'<file-to-keep>$ | \
GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && \
mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' --prune-empty -- --all
Run Code Online (Sandbox Code Playgroud)
索引过滤器使用打印索引的当前内容git ls-files -s,仅输出要保留的文件(grep非常痴迷 - 字段以制表符分隔,文件名是最后一个),然后使用该信息创建新索引,并将其移到旧的顶部.
该--prune-empty选项导致filter-branch删除任何现在什么都不做的提交(即它们只触及其他文件),并-- --all告诉它重写所有引用.
与使用filter-branch一样,最好在一个新的克隆中执行此操作,因此如果您将任何内容搞砸了,那么即使filter-branch确实将备份保留在refs/originals中也是如此.您可能还想阅读用于缩小联机帮助页中存储库的核对表 ; 结果是,一旦你完成了,真正摆脱你不再需要的所有东西的最好方法就是简单地克隆过滤后的存储库.
这实际上即使该文件是在同一提交的其他文件修改工作,虽然我想你可以尝试偷偷摸摸,并通过简单地生成补丁,所有提交利用这一事实确实触及该文件,然后去和建设应用这些补丁的新存储库......但为什么要这么麻烦?
(旁注:删除单个文件比保留单个文件更容易.在这种情况下,您只需要使用git rm --cached --ignore-unmatch <filename>索引过滤器.)
我最终使用这篇文章(否则不相关)的回复来构建解决方案。我没有将树重新设置为具有新根的树,而是修改了旧根并将--onto内容重新设置为新根: