合并两个Git仓库而不会破坏文件历史记录

问题:

我需要将两个Git仓库合并成一个全新的第三仓库。我已经找到了很多关于如何使用子树合并(例如How do you merge two Git repositories?上的Jakub Narębski’s answer)进行此操作的描述,除了当我提交子树合并时,旧的存储库中的所有文件都是记录为新添加的文件。当我做git log时,我可以看到来自旧存储库的提交历史记录,但是如果我做了git log <file>,则只显示该文件的一个提交 – 子树合并。从上述答案的评论来看,我并不是一个人看到这个问题,但我没有找到任何发布的解决方案。
有什么办法可以合并存储库,并保持个人文件的历史记录不变?

回答:

事实证明,如果您只是试图将两个存储库粘合在一起,并使其看起来像一直如此,而不是管理外部依赖关系,则答案会更简单。您只需将遥控器添加到旧的回购站,将它们合并到新的主控室,将文件和文件夹移动到子目录,提交移动,然后重复所有额外的回购。子模块,子树合并和花式重定义是为了解决一个稍微不同的问题,并不适合我正在尝试做的事情。
以下是将两个存储库粘合在一起的示例Powershell脚本:
class=”lang-bsh prettyprint-override”>

# Assume the current directory is where we want the new repository to be created
# Create the new repository
git init

# Before we do a merge, we have to have an initial commit, so we'll make a dummy commit
dir > deleteme.txt
git add .
git commit -m "Initial dummy commit"

# Add a remote for and fetch the old repo
git remote add -f old_a <OldA repo URL>

# Merge the files from old_a/master into new/master
git merge old_a/master --allow-unrelated-histories

# Clean up our dummy file because we don't need it any more
git rm .\deleteme.txt
git commit -m "Clean up initial file"

# Move the old_a repo files and folders into a subdirectory so they don't collide with the other repo coming later
mkdir old_a
dir -exclude old_a | %{git mv $_.Name old_a}

# Commit the move
git commit -m "Move old_a files into subdir"

# Do the same thing for old_b
git remote add -f old_b <OldB repo URL>
git merge old_b/master --allow-unrelated-histories
mkdir old_b
dir –exclude old_a,old_b | %{git mv $_.Name old_b}
git commit -m "Move old_b files into subdir"

显然,如果你愿意的话,你可以将old_b合并到old_a(这成为新的联合回购) – 修改脚本以适应。
如果您还想要引入进行中的功能分支,请使用以下命令:
class=”lang-bsh prettyprint-override”>

# Bring over a feature branch from one of the old repos
git checkout -b feature-in-progress
git merge -s recursive -Xsubtree=old_a old_a/feature-in-progress

这是进程中唯一不明显的部分 – 这不是一个子树合并,而是正常递归合并的一个参数,告诉Git我们重命名了目标,并帮助Git正确地排列所有内容。
我写了一个稍微更详细的解释here

 
 
Code问答: http://codewenda.com/topics/git/
Stackoverflow: Merge two Git repositories without breaking file history

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 1 = 8