How do I combine two Git repositories, one a snapshot of the other with current history?
我需要做这个问题的逆解。
因此,差不多一年前,我们通过将两个分支的当前状态复制到一个新的存储库中,将我们的Git存储库从自身分离出来。简单来说:
1 2 | <== 2015 Dec 1 Jan 2016 Jan ==> Past history, till SVN New Repo First Commit All commits to present |
我们很快将使用子树将此存储库中的每个项目转换为它自己的Git存储库,但我不想这样做,只要我们在中央存储库中缺少5年的提交历史。以下是我迄今为止尝试的步骤:
1 2 3 4 5 6 7 | cd ProjectFull/ git reset --hard # Project was in a branch git checkout master # Go to master before trying to rebase git remote add ProjectSplit ../ProjectSplit # New repository is in another directory git fetch ProjectSplit # Fetch new repository git cherry-pick <initial commit hash> --strategy-option theirs git pull --rebase -s recursive -X theirs origin master |
号
我的想法是挑选新回购的初始承诺,然后重新平衡该承诺,但失败了。上面列出的命令不会出错,但会删除旧存储库的所有历史记录。
以下是我的git-rebase的截断日志:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | $ git rebase origin dev First, rewinding head to replay your work on top of it... Applying: Merge branch 'dev' of <REPO> into dev Using index info to reconstruct a base tree... <stdin>:298480: trailing whitespace. <stdin>:298553: trailing whitespace. <stdin>:298559: trailing whitespace. <stdin>:298565: trailing whitespace. <stdin>:298571: trailing whitespace. warning: squelched 1751272 whitespace errors warning: 1751277 lines add whitespace errors. Falling back to patching base and 3-way merge... CONFLICT (add/add): Merge conflict in <FILE> Auto-merging <FILE> CONFLICT (add/add): Merge conflict in <FILE> Auto-merging <FILE> CONFLICT (add/add): Merge conflict in <FILE> Auto-merging <FILE> CONFLICT (add/add): Merge conflict in <FILE> Auto-merging <FILE> CONFLICT (add/add): Merge conflict in <FILE> Auto-merging <FILE> <Same> Failed to merge in the changes. Patch failed at 0001 Merge branch 'dev' of <REPO> into dev The copy of the patch that failed is found in: ProjectFull/.git/rebase-apply/patch When you have resolved this problem, run"git rebase --continue". If you prefer to skip this patch, run"git rebase --skip" instead. To check out the original branch and stop rebasing, run"git rebase --abort". |
这个答案中的脚本在旧repo补丁的中途失败。
这个答案只适用于不同的存储库。
您的里程数可能会有所不同,我很可能误解了问题和您的意图,因此我将简要总结以下选项:
考虑缝合休息PerlCPAN有git-stitch repo,这是一个很好的模块,可以将
应该将历史线性化。
子目录选项有两张纸片而不是一张。或多个目录。
你已经按照程序做了。放弃从你的问题中挑选最后一个樱桃,只需要让
最不麻烦的,只是粘在一起休息。不要试图将历史线性化。
Git子树合并合并子树是一个git命令,比子树和子模块都容易使用(并且管理较少)。
在查看单个文件的Git日志时(合并后),可能需要使用
你确定会有帮助吗?如果你把旧的git日志输入elk,那么索引搜索是否更适合你的同事(和你自己)?是否可以在Kibana中设置一些仪表盘?或者,如果您将
从来没有尝试过,所以不能推荐,但显然只是在这样一个场合,这是写时,吉特斯蒂普回购年轻。可能值得一看。
用一些重写还有一个选项,可以使用git filter分支进行一些历史重写。可能也可以用BFG来完成。