我正在使用这个rest-more存储库,其中包含许多web-api的实现(例如Facebook或Linkedin)。我分叉了那个存储库,在我的分支中,我添加了自己的另一个web api的实现。
但是现在我发现要保持对原始存储库的更新非常困难。每次原始存储库更改时,我都会对我的分支进行rebase,这非常繁琐。所以我想将自己的实现拆分为一个独立的存储库。
我的所有提交都在我的分支中。只有一个提交正在触及原始存储库中的文件。
有没有一种简单的方法可以将我的提交移动到新的存储库中?我想这样做,所以我可以保留我的提交历史。
答案 0 :(得分:1)
最简单:只需停止接受原始存储库中的更新即可。从.git / config文件中删除远程存储库。
否则,从我的笔记:
假设您要将 dir1 从存储库 A 移至存储库 B :
复制存储库 A 。为了安全起见,我们打破了链接 克隆和 A 之间,以确保我们没有任何更改 不小心被送回了。
git clone git://git.foo.com/ProjectA.git NewProject
cd NewProject
git remote rm origin
删除除 dir1 以外的所有内容。
git filter-branch --subdirectory-filter dir1
这会使dir1成为新根,您可能想要撤消它:
mkdir dir1
mv * dir1
git commit -a
现在将此存储库合并到存储库 B
git clone git://git.foo.com/ProjectB.git ProjectB
cd ProjectB
git remote add repo-A-branch ~/NewProject
git pull repo-A-branch master
git remote rm repo-A-branch
答案 1 :(得分:1)
我建议保留单个存储库,为您的更改创建第二个分支。然后,您可以 cherry pick提交到此新分支,隔离您的更改,并将上游更改和更改合并/重新绑定到第三个分支,以便创建代码版本。将它保存在一个存储库中可以更容易地与上游开发保持同步,并且在自己的分支上进行更改可以让它们保持隔离状态。第三个分支可以作为“您的更改应用于上游代码”分支。
答案 2 :(得分:1)
假设您拥有提交的严格线性历史记录(无合并),您可以按如下方式导出所有提交:
git format-patch <start>..<stop>
start
和stop
是您需要的提交范围(start
是您提交的提交,stop
可能是当前提交的HEAD
。< / p>
这将创建许多名为NNNNN-commit-description.patch
的文件,NNNNN是从00001开始的编号。
然后,创建新的空存储库并导入这些补丁:
git init newrepo
cd newrepo
find <oldrepo>/*.patch | xargs git am
此外,您可能希望首先使用您所依赖的原始文件进行提交,而不是启动空仓库,这样您的所有修补程序都可以干净利用。
答案 3 :(得分:0)
我首先打开一个新的存储库:
git init new-repo
然后我将我的分支推送到该存储库:
cd rest-more
git push ../new-repo/ my_branch
cd ../new-repo
git co my_branch
我创建了一个新的空初始提交:
git checkout --orphan newroot
git commit --allow-empty -m 'root commit'
然后我将我的分支重新绑定到此起点,使用交互式标记仅选择我的提交:
git rebase --onto newroot --root my_branch -i
需要在途中解决冲突,最后我最终得到一个只有我的提交的存储库。
(可能会有所改进。请随意提出建议。)