将一些git提交移动到一个新的repo中

时间:2013-06-05 03:10:34

标签: git

我正在使用这个rest-more存储库,其中包含许多web-api的实现(例如Facebook或Linkedin)。我分叉了那个存储库,在我的分支中,我添加了自己的另一个web api的实现。

但是现在我发现要保持对原始存储库的更新非常困难。每次原始存储库更改时,我都会对我的分支进行rebase,这非常繁琐。所以我想将自己的实现拆分为一个独立的存储库。

我的所有提交都在我的分支中。只有一个提交正在触及原始存储库中的文件。

有没有一种简单的方法可以将我的提交移动到新的存储库中?我想这样做,所以我可以保留我的提交历史。

4 个答案:

答案 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>

startstop是您需要的提交范围(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

需要在途中解决冲突,最后我最终得到一个只有我的提交的存储库。

(可能会有所改进。请随意提出建议。)