现有bitbucket repo A超过200次提交。 我下载了代码(没有.git文件)。 在第一次提交中添加了所有现有代码,创建了新的repo B. 回购B再提交150多个提交。 repo A没有新的提交,我只在repo B上工作。 现在要求是包含所有代码和历史记录的单个仓库(如果可能的话) 或Repo B在历史记录中作为单个条目更改。 第三个回购C将很好,因为不想冒A和B的风险。
答案 0 :(得分:4)
如果我理解正确,你现在有
你希望用
获得C.假设这是正确的,这是通过补丁来实现的一种方式:
获得A:
的新答案$ git clone A C
检查B中初始提交的哈希值(用A中的东西)是:
$ cd B
$ git log --oneline|tail -1
1234beef Initial commit
仍在B中,将所有剩余工作导出为补丁:
$ git format-patch 1234beef..HEAD
(这将在B)中生成一堆.patch
个文件
将所有这些更改导入到A:
的新克隆中$ cd C
$ git am ../B/*.patch
你已经完成了。
答案 1 :(得分:1)
另一种解决方案是使用grafts和filter-branch。请参阅示例部分,示例将提交(通常位于另一个历史记录的最前端)设置为当前初始提交的父级正是您要执行的操作。这是更可靠的方式,因为它允许将所有分支一起更改并重新排序历史图表,无论如何。
首先,您需要git clone B C
,然后cd C
和git fetch A master
。所以,你的C将从两个存储库中提交。然后将<initial commit id from B> <last commit id from A>
添加到.git/info/grafts
文件中。然后运行git filter-branch <initial commit id from B>..HEAD
。
答案 2 :(得分:0)
git rebase -p --onto
可能是最简单的。 Rebase的-p
选项尝试保留合并结构,其--onto
允许明确指定新基数和切割基数。
所以,
A=/path/to/original/repo
B=/path/to/your/work
git clone $B C
cd C
root=$(git rev-list --max-parents=0 master)
echo $root # this should spit a single id
git fetch $A
git rev-parse $root^{tree} # the two outputs here
git rev-parse FETCH_HEAD^{tree} # ... should be equal
git rebase -p --onto FETCH_HEAD $root master # if both the above are true, bingo