说,我有Repo1
如下
special -> E ... F ... G ... H
/
master -> A ... B ... C ... D ... X ... Y ... Z
我该如何Repo2
开始master
?E
那是因为Repo2
我以前根本不关心历史E
。
如果您要保留的历史记录包含合并,最简单的方法可能是使用嫁接来临时切断不需要的历史记录,然后 filter-branch 创建一个具有该历史视图作为永久视图的分支。
cd /path/to/repo
git checkout -b newbranch special
git rev-parse E > .git/info/grafts
git filter-branch
rm .git/info/grafts
这假设您目前没有任何移植物。由于移植物很少使用,无论如何在新的克隆中这样做可能是一个好主意,这应该不是问题。
git checkout --orphan newbranch E
git commit -c E
git cherry-pick F..H
git init --bare /path/to/new/repo
git push /path/to/new/repo HEAD:master
简单明了的方法:检查 E 并制作工作目录的副本,但请确保不要携带 .git 目录。现在从那里初始化一个新的 git repo 并将其他提交移过来。git format-patch
并且git apply
是你的朋友。
虽然git filter-branch
可能涉及,但本文给出了一个带有补丁的原始解决方案:
创建一堆补丁,如下所示:
git checkout find-ls
git format-patch 9758db3 # where find-ls branched
如果你需要让你的新仓库有不同的结构,你可能需要破解补丁。我刚用过:
perl -pi -E 's|LEADING-DIR/||g' *.patch
然后你可以应用补丁:
mv 0*.patch where/I/want/my/new/repo
cd where/I/want/my/new/repo
git am *.patch