(编辑问题:)
我在 github 中有 2 个存储库,这些存储库是 http://github.com/abc.git和 http://github.com/xyz.git .
现在存储库“abc.git”是该项目的主要存储库。经过大约一个月的开发,我们发现我们可以通过制作可重用的代码来做得更好。所以我们决定为可重用的通用代码库创建一个新的 repo,即 xyz.git。所以现在我们有
- abc.git(非常具体的项目代码 + 外部模块 + “我们想要重写的代码”)
- xyz.git(代码“我们可以重复使用”+ 外部模块)
现在我们使可重用的代码基本上是我们添加了一些新文件,删除了一些旧文件并在 xyz.git 中进行了修改。此代码最初来自 abc.git 中的“我们要重写”的代码。
到目前为止一切顺利,我希望 :)
现在我们有两个选择
创建一个新的仓库,比如 project.git,添加一个新的远程仓库,即 xyz.git,然后 merge 并从 abc.git 中挑选我们需要的文件。所以就命令而言如下
- 整个 github 新 repo 创建过程并添加一个 README 文件。 (这是我的 project.git 来源)
- git 远程添加 xyz git@github.com:xyz.git
- git checkout -b xyz
- git pull xyz master
- git 状态
- git checkout 大师
- git merge xyz
- git commit -a
- git push origin master
现在我们已经用 xyz.git + README 填充了 project.git 并开始从 abc.git 中挑选文件的艰苦工作(我想避免,我也错过了所有旧历史)
我认为我可以做的是从 abc.git 中删除所有文件并恢复 xyz.git。在代码方面按以下方式。
- git rm -r *(这是我的 abc.git 来源)
- git commit -m
git push origin master(现在abc.git没有文件但是有.gitmodules和.git)
git 远程添加 xyz git@github.com:xyz.git
- git checkout -b xyz
- git pull xyz master
这是冲突开始的地方..有两种类型的冲突(外部模块,因为一些通用的外部模块和一些文件)。
我考虑过第三种选择,即只执行 git log -l 并将其转储到文本文件并使用一些查看器来获取历史记录。
坦率地说,我只是想尽可能地保存历史, cherry-pick 很无聊,但它是可行的。另一个问题是,如果需要删除 repo,如何保存 repo 日志?我想让一个已失效的 repo 保持活力的唯一原因是为了历史和变化。
谢谢。
最佳答案
您的编辑使它变得更好,但仍然很难知道您到底想做什么。例如:如果 xyz 是对 abc 的有效(功能齐全)进化,我仍然不清楚为什么要挑选。
如果您想要 merge 两个存储库以便不丢失任何历史记录,那么......就去做吧。你可以有两个独立的分支机构住在那里,而不会踩在对方的脚上。例如(取这两个是因为它们位于 github 的 repo 页面之上):
$ git clone git://github.com/rails/rails.git monster
$ cd monster
$ git fetch git://github.com/madrobby/scriptaculous.git master:old
$ git branch
* master
old
$ ls
[ looks like rails ]
$ git checkout old
$ ls
[ looks like scriptaculous ]
$ git checkout master
[ looks like rails again ]
如果你想要的是 merge 历史基线,即让 xyz 成为 abc 的后代,它在 git filter-branch
手册页(搜索 --parent-filter
),你只想使用你的 abc “旧”分支作为移植点。
说到嫁接点,貌似可以直接用来做这个,不过我对这个概念比较陌生。看看this discussion了解更多详情。
关于git - 当我想从 git repo 中删除所有文件然后添加新文件时如何避免冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1394159/