0

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

但是现在我发现很难与原始存储库保持更新。每次原始存储库更改时,我都会重新定位我的分支,这非常乏味。所以我想将我自己的实现拆分到一个独立的存储库中。

我所有的提交都在我的分支中分组在一起。只有一个提交涉及来自原始存储库的文件。

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

4

4 回答 4

1

Assuming that you have strictly linear history of your commits (no merges), you can simply export all your commits as follows:

git format-patch <start>..<stop>

Where start and stop is range of commits you need (start is commit you started from, and stop is probably current HEAD).

This will create lots of files named NNNNN-commit-description.patch, NNNNN is number starting from 00001.

Then, create new empty repository and import these patches:

git init newrepo
cd newrepo
find <oldrepo>/*.patch | xargs git am

Also, instead of starting off empty repo, you may want to make first commit with some original files that you depend upon, such that all your patches can apply cleanly.

于 2013-06-05T04:34:33.510 回答
1

最简单:停止接受来自原始存储库的更新。从 .git/config 文件中删除远程存储库。

否则,从我的笔记中:

假设您要将dir1从存储库A移动到存储库B

克隆存储库A。为了安全起见,我们断开了 clone 和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
于 2013-06-05T03:15:56.457 回答
1

建议保留一个存储库,并为您的更改创建第二个分支。然后,您可以挑选您对这个新分支的提交,以隔离您的更改,并将上游更改和您的更改合并/rebase 到第三个分支中,以创建您的代码版本。将其保存在一个存储库中可以更轻松地与上游开发保持同步,并且将您的更改放在自己的分支上可以让您保持隔离。第三个分支可以用作“您的更改应用于上游代码”分支。

于 2013-06-05T03:16:45.143 回答
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

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

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

于 2013-06-05T03:44:21.140 回答