我正在使用这个rest-more存储库,它包含了许多web api的实现(比如Facebook或Linkedin)。我分叉了这个存储库,并在我的分支中添加了我自己的另一个web api的实现。然而现在我发现很难保持与原始仓库的更新。每次原始仓库更改时,我都会重基我的分支,这非常繁琐。所以我想将我自己的实现拆分到一个独立的仓库中。我所有的提交都集中在我的分支中,只有一个提交涉及到了原始仓库中的文件。有没有简单的方法可以将我的提交移到一个新的仓库中?我想这样做,这样我就可以保留我的提交历史。
tyg4sfes1#
最佳:停止接受来自原始仓库的更新。从.git/config文件中删除远程仓库。否则,从我的笔记:假设您要将目录1从存储库A移动到存储库B:克隆仓库A。为了安全起见,我们断开克隆和A之间的链接,以确保我们的更改不会意外地被发送回来。
git clone git://git.foo.com/ProjectA.git NewProject cd NewProject git remote rm origin
字符串把所有的东西都去掉,除了dir 1。
git filter-branch --subdirectory-filter dir1
型这将使dir 1成为新的根目录,您可能希望撤消此操作:
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
型
lrl1mhuk2#
我会建议保持一个单一的存储库,并为您的更改创建第二个分支。然后,您可以**cherry pick您的提交**到这个新的分支,以隔离您的更改,并将上游更改和您的更改合并/重定基到第三个分支中,以创建您的代码版本。将其保持在一个存储库中可以更容易地与上游开发保持同步,并且将您的更改放在它们自己的分支上允许您将它们保持隔离。第三个分支可以作为“您的更改应用到上游代码”的分支。
bhmjp9jg3#
假设你有严格的线性提交历史(没有合并),你可以简单地导出所有的提交,如下所示:
git format-patch <start>..<stop>
字符串其中start和stop是你需要的提交范围(start是你开始的提交,stop可能是当前的HEAD)。这将创建许多名为NNNNN-commit-description.patch的文件,NNNNN是从00001开始的数字。然后,创建新的空存储库并导入这些补丁:
start
stop
HEAD
NNNNN-commit-description.patch
git init newrepo cd newrepo find <oldrepo>/*.patch | xargs git am
型此外,与其从空的repo开始,你可能想用你依赖的一些原始文件进行第一次提交,这样你所有的补丁都可以干净地应用。
ffx8fchx4#
首先打开一个新的repository:
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
型需要在途中解决冲突,最后我得到了一个只有我提交的存储库。(可能还需要改进,请随意提出任何建议。)
4条答案
按热度按时间tyg4sfes1#
最佳:停止接受来自原始仓库的更新。从.git/config文件中删除远程仓库。
否则,从我的笔记:
假设您要将目录1从存储库A移动到存储库B:
克隆仓库A。为了安全起见,我们断开克隆和A之间的链接,以确保我们的更改不会意外地被发送回来。
字符串
把所有的东西都去掉,除了dir 1。
型
这将使dir 1成为新的根目录,您可能希望撤消此操作:
型
现在将此存储库合并到存储库B中
型
lrl1mhuk2#
我会建议保持一个单一的存储库,并为您的更改创建第二个分支。然后,您可以**cherry pick您的提交**到这个新的分支,以隔离您的更改,并将上游更改和您的更改合并/重定基到第三个分支中,以创建您的代码版本。将其保持在一个存储库中可以更容易地与上游开发保持同步,并且将您的更改放在它们自己的分支上允许您将它们保持隔离。第三个分支可以作为“您的更改应用到上游代码”的分支。
bhmjp9jg3#
假设你有严格的线性提交历史(没有合并),你可以简单地导出所有的提交,如下所示:
字符串
其中
start
和stop
是你需要的提交范围(start
是你开始的提交,stop
可能是当前的HEAD
)。这将创建许多名为
NNNNN-commit-description.patch
的文件,NNNNN是从00001开始的数字。然后,创建新的空存储库并导入这些补丁:
型
此外,与其从空的repo开始,你可能想用你依赖的一些原始文件进行第一次提交,这样你所有的补丁都可以干净地应用。
ffx8fchx4#
首先打开一个新的repository:
字符串
然后,我将我的分支推到该存储库:
型
我创建了一个新的空初始提交:
型
然后我将我的分支重基到这个起点,使用交互式标志来只选择我的提交:
型
需要在途中解决冲突,最后我得到了一个只有我提交的存储库。
(可能还需要改进,请随意提出任何建议。)