如何使用Git把多个项目fork到一个仓库?

5

我有三个项目想要分叉。它们彼此相关,更改一个项目可能需要更改另一个项目。由于它们都相关,我想为这些分叉创建一个存储库,同时保持从每个原始存储库获取更新的能力。

我应该如何设置我的git存储库?

这些只是初步想法,所以如果这很疯狂/愚蠢,我也不会感到惊讶。这样做可行吗?


你能否详细说明为什么你想要一个单一的代码库来管理你的三个独立但相关的项目? - Bruno Reis
我的意思是:你想要实现什么目标?请记住,Git与SVN或CVS完全不同... - Bruno Reis
与其分开构建(并且按正确的顺序),我希望将它们作为同一构建过程的一部分。由于它们都必须在一个上下文中,因此对我来说,一个仓库是有意义的选择。还有其他想法吗?另外,我打算在此上下文中拥有自己的项目(这些项目依赖于这些内容)。 - Dane O'Connor
我可能应该指出我正在使用静态语言(c#)。 - Dane O'Connor
你是如何构建它们的?使用Visual Studio吗?你有三个单独的解决方案吗?还是在同一个解决方案中有三个项目? - Bruno Reis
你可以随时使用 "git remote add <name> <url>" 命令添加更多的源代码库。 - Jakub Narębski
4个回答

5
你可能对git子模块功能感兴趣。引用自这里:
Git的子模块支持允许一个存储库包含一个外部项目的检出作为子目录。子模块保持自己的身份,子模块支持只存储子模块存储库的位置和提交ID,因此,克隆包含项目(“超级项目”)的其他开发人员可以轻松地在同一版本中克隆所有子模块。超级项目的部分检出是可能的: 你可以告诉Git不克隆、选择或全部克隆子模块。

看起来创建子模块会将每个项目视为独立的。不幸的是,我希望将它们全部合并在一起。在子模块的手册页面上(感谢你指引我到这里),它建议使用远程和“子树合并”策略。我会深入了解并报告结果。 - Dane O'Connor
这是git-submodule文档的更新链接: http://git-scm.com/book/en/Git-Tools-Submodules - Leon Fedotov
使用子模块对我来说很有意义,但我已经在子模块仓库的代码中进行了一些更改。我该如何将我的子模块更改推送到我的仓库? - Beginner

4
您可以始终使用"git remote add <name> <url>"添加更多的源代码库。

我应该如何获取/合并某个目录中仅文件的源代码。这很难解释。更明确地说:如果我有文件夹“proj1”和“proj2”,并且分别拥有每个远程,则如何告诉远程proj2上的获取其源根是/prog2? - Dane O'Connor
2
子树合并...或者子模块。 - Jakub Narębski

2

有一种可能性我从未真正尝试过,但可能效果很好。

假设你有三个项目,分别被创造性地命名为Proj1Proj2和(猜猜)Proj3。假设它们中的全部或部分依赖于外部库,例如一个称为Lib1.dll和另一个称为SuperLib.dll

首先,对于文件夹结构,我会做类似这样的事情:

MyCode\
    build_all.bat
    Docs\
        [...]
    Libs\
        Lib1.dll
        SuperLib.dll
    Proj1\
        [...]
    Proj2\
        [...]
    Proj3\
        [...]

然后您需要在每个ProjX文件夹中创建一个存储库:
cd \MyCode\Proj1
git init
cd \MyCode\Proj2
git init
cd \MyCode\Proj3
git init

然后您需要为整个项目创建一个仓库:
cd \MyCode
git init

这个代码库的内容是关于git的,包括Libs文件夹及其内容、build_all.bat构建脚本和3个子项目。

所以一旦你更改源代码,比如说Proj1\Main.cs,整个项目都不会看到修改。你需要在Proj1上进行git commit,然后再去整个项目并git commit它(现在git将能够看到Proj1已被修改)。

使用这种方法,整个项目的历史记录仅会说明ProjX何时被修改,但它不会直接跟踪每个文件。然而,如预期的那样,ProjX的代码库将像往常一样跟踪每个文件。

如果你在“真实项目”上尝试了一下,请告诉我结果!

祝你好运!


嗯,git命令如何知道“整个东西”和每个子存储库之间的区别?我怀疑它可能会有点混乱。您以前尝试过在存储库中使用存储库吗? - Dane O'Connor
它不会混淆:寻找存储库时,git将在当前目录中查找;如果内部没有“.git”目录,则会向上一级继续查找存储库(“.git”目录),直到找到第一个存储库为止。因此,您是安全的。 - Bruno Reis

0

我认为我应该使用子树合并策略。我必须实际尝试一下,看看它是否有效。如果这是一个好方法,我会将此答案标记为已接受。

与此同时,我仍然愿意听取建议。


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