如何组合两个Git存储库,一个是当前历史记录的另一个快照?


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 fast-export简化为git fast-import

应该将历史线性化。

子目录选项

有两张纸片而不是一张。或多个目录。

你已经按照程序做了。放弃从你的问题中挑选最后一个樱桃,只需要让oldrepo作为当前目录。

最不麻烦的,只是粘在一起休息。不要试图将历史线性化。

Git子树合并

合并子树是一个git命令,比子树和子模块都容易使用(并且管理较少)。

在查看单个文件的Git日志时(合并后),可能需要使用--follow

重新检查你为什么需要它

你确定会有帮助吗?如果你把旧的git日志输入elk,那么索引搜索是否更适合你的同事(和你自己)?是否可以在Kibana中设置一些仪表盘?或者,如果您将git instaweb设置在一台带有旧repo的机器上,这样人们就可以通过Web浏览它,那么它可能满足您的需求吗?

考虑Git合并回购

从来没有尝试过,所以不能推荐,但显然只是在这样一个场合,这是写时,吉特斯蒂普回购年轻。可能值得一看。

用一些重写

还有一个选项,可以使用git filter分支进行一些历史重写。可能也可以用BFG来完成。