使用SourceTree将两个GIT存储库合并为一个

3
我有为每个我开发的Arduino项目创建单独的GIT存储库,我使用SourceTree连接到Bitbucket中的远程存储库进行处理。
我想知道如何将这些存储库合并为一个,并保留每个文件的历史更改记录。
在SourceTree内是否可以完成此操作?我还没有使用过命令行来操作GIT。
1个回答

0

您可以在BitBucket中创建一个新的git repo,将其克隆并将您现有的两个bitbucket repos作为此新repo的submodules添加。

使用Sourcetree(自2012年及其1.3版本以来),这很容易实现。

https://blog.sourcetreeapp.com/files/2012/02/SourceTree_Submodules1.png

然后,您将被提示提供源URL以克隆内容,以及此子模块将驻留在当前存储库中的路径。
一旦您更改了任何一个子模块中的内容,您可以推送所有内容(子模块,但也包括记录git链接,特殊条目在索引中的父级repo)。

http://blog.sourcetreeapp.com/files/2012/02/SourceTree_Submodules5.png

(此截图适用于Mercurial仓库,但对于Git仓库也是一样的)


另一种选择是git subtree在这里说明,该方法与子模块不同

即使 git-subtree.sh add --prefix /url/to/repo.git master --squash 将把 vim-surround 仓库的所有历史记录压缩成一个单一的合并提交,subtree push 仍将推送更多历史记录到您的原始子树仓库,保留和完整其历史记录。


我尝试了你的建议,但我不确定它是否符合我的要求。我为我的每个Arduino/电子项目创建了一个不同的文件夹和存储库。现在我发现我有太多的项目,为每个新项目创建一个单独的存储库很麻烦,所以想将它们全部加入到一个名为“电子项目”的新存储库中。有什么建议吗? - Serge
@Serge 然后你可以了解一下 git substree(https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree),我在 https://dev59.com/vmAf5IYBdhLWcg3wXh2z#24709789 中有所阐述。它与子模块(https://dev59.com/uVwZ5IYBdhLWcg3wJ9nN#31770147)不同。 - VonC
我尝试了子树,确实这就是我需要的。我成功地将旧版本库拉入新版本库,但无法在“导入”到新版本库后保留历史记录。旧版本库文件被拉取并添加到新版本库,但提交历史记录丢失了。有什么想法吗?奇怪的是,在sourcetree中时间轴显示正确的提交历史记录,但在bitbucket中文件只显示一个提交历史记录。 - Serge
@Serge 尽管如此,子树推送仍会将额外的历史记录推送到您的原始子树存储库中,保留并完善其历史记录。我已经编辑了答案以反映这一点。 - VonC
我没有勾选“压缩提交”选项。我不确定为什么历史记录没有被保留。我的操作步骤如下:1)创建一个指向旧存储库和新存储库内文件夹的子树;2)拉取子树(通常会出现某种冲突,但文件已被拉取,尽管不在指定的文件夹中);3)提交文件。我还尝试了将文件重新定位后再提交,但是出现了相同的问题。 - Serge
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接