【发布时间】:2016-07-04 10:25:50
【问题描述】:
我的要求:将一个 git repo 分解为多个 git repo,保留与原始 repo 相同的目录结构,并保留复制到新 repo 的文件的提交历史记录。 我已经尝试过的:
首先我根据http://gbayer.com/development/moving-files-from-one-git-repository-to-another-preserving-history/ 中的建议尝试了 git filter-branch --subdirectory-filter 结果:历史记录被保留,但只能在运行时查看 git日志--关注 此外,在 Github 上无法查看原始提交历史记录。它只是将我的合并提交显示为该文件的唯一提交,并且不显示任何以前的提交。我仍然可以忍受这个限制并接受它作为解决方案。但是我对这种方法的另一个担忧是,对于我要复制的每个文件夹和每个文件,我需要多次克隆原始存储库,并且每次都重复所有这 12 或 13 个步骤。我想知道是否有更简单的方法,因为我要移动很多文件。此外,由于该帖子已有 5 年历史,只是想知道是否有更新更简单的解决方案可用? (令人惊讶的是,Google 大多将此博客显示为第一个搜索结果)
接下来我尝试的是对早期 Greg Bayer 的帖子 http://gbayer.com/development/moving-files-from-one-git-repository-to-another-preserving-history/#comment-2685894846 的评论 该解决方案通过使用 git subtree split 使事情变得更简单,但结果与第一种情况中列出的相同。
然后我根据这个答案尝试了 git log --patch-with-stat 和 git am 选项https://stackoverflow.com/a/11426261/5497551 结果:在应用补丁时,这通常会在遇到合并时出错。 我尝试了使用 -m --first-parent 这个答案的建议之一,这解决了错误,但没有将任何合并扩展到他们的提交中,只是将合并列为单个提交。因此,大部分提交历史都丢失了。 所以我添加了另一个选项--3way。这一遍又一遍地提交,并没有导致任何可接受的解决方案。
总之,我更喜欢使用第三种解决方案,只要有一个选项可以将合并中的所有提交都列在新仓库的历史记录中。否则我必须坚持第一个解决方案,这在我的情况下有点不方便和乏味。任何建议,帮助将不胜感激。
谢谢。
【问题讨论】:
-
and also preserve the commit history for all files- 所以只是删除你不想保留的位?您可能会发现这很有用:New repo with copied history of only currently tracked files. -
谢谢。当您说
delete everything and just restore the files you want to keep:时,您能帮我了解我们在哪一步恢复我想要保留的文件吗?因为 keep-these.txt 将列出当前存储库中存在的所有文件,对吗?还是我应该先删除不需要的文件,然后再执行git ls-files > keep-these.txt?我对 git 很陌生,所以不太熟悉它的所有概念。 -
请编辑您的问题以明确。从问题描述中不清楚为什么
git rm somefolder; git commit -m "deleting somefolder"没有做你想做的事——你特别要求保留 all 文件的提交历史;还要具体说明您所拥有的以及您期望的结果;将顶级文件夹/文件放在问题中 - 以及您想要实现的目标。 -
@AD7six 首先很抱歉这么晚才回复。您的回答帮助我实现了我想要的,因此我必须立即开始工作,因为我昨天发布了。现在,从我之前拥有的一个 repo 中,我创建了四个新的 repo,它们都有自己文件的 git 历史记录。我知道前面的问题没有澄清最后一部分
git history for their own files因此已相应更新。 -
但可能我一开始就考虑了很多,从那时起,我更关心拥有我正在移动的文件的历史而不是没有我不移动的文件的历史记录。但是你的回答帮助我完成了这两件事,因此我现在更开心了:)`为什么 git rm somefolder; git commit -m "deleting somefolder" 没有做你想做的事`正如我所说,我是 git 新手,因此我不知道你可以克隆一个 git repo 并只需通过删除和添加将其转换为新的 repo遥远的起源。之前没有任何帖子或论坛建议过这一点。