【问题标题】:How do I fork multiple projects into one repository with git?如何使用 git 将多个项目分叉到一个存储库中?
【发布时间】:2009-11-11 22:17:00
【问题描述】:

我有 3 个项目要分叉。它们都是相互关联的——改变一个可能需要改变另一个。因为它们都是相关的,所以我想为这些分支创建 1 个存储库,同时保持从每个原始版本中提取更新的能力。

如何设置我的 git 存储库?

这些是初步的想法,所以如果这是疯狂/愚蠢的,我不会感到惊讶。是吗?

【问题讨论】:

  • 您能否详细说明为什么您希望为您的 3 个不同但相关的项目提供一个存储库?
  • 我的意思是:你想达到什么目的?请记住,git 与 SVN 或 CVS 完全不同...
  • 我不想单独构建每个(并以正确的顺序),我想让它们成为同一个构建过程的一部分。因为它们都必须在一个上下文中,所以一个存储库对我来说很有意义。还有什么想法吗?此外,我打算在这种情况下拥有自己的项目(依赖于这些项目)。
  • 我可能应该指出我使用的是静态语言 (c#)
  • 你是如何构建它们的?视觉工作室?您有 3 个单独的解决方案?还是同一个解决方案中有 3 个项目?

标签: git fork multiple-projects


【解决方案1】:

您可能对git-submodule 功能感兴趣。引用here:

Git 的子模块支持允许一个 要包含的存储库,作为 子目录,一个结帐 外部项目。子模块维护 他们自己的身份;子模块 支持只存储子模块 存储库位置和提交 ID,所以 其他克隆的开发者 包含项目(“超级项目”) 可以轻松克隆所有子模块 相同的修订。部分结帐 的超级项目是可能的:你 可以告诉 Git 克隆 none、some 或 所有子模块。

【讨论】:

  • 看起来创建子模块会将每个项目视为独立的。不幸的是,我希望将它们全部合并。在子模块的手册页上(感谢您指向我这里),它建议使用遥控器和“子树合并”策略。我会深入研究并报告。
  • 这是 git-submodule 文档的更新链接:git-scm.com/book/en/Git-Tools-Submodules
  • 使用子模块对我来说很有意义,但是我对子模块 repo 的代码做了一些更改。如何将子模块的更改推送到我的仓库?
【解决方案2】:

您始终可以使用“git remote add <name> <url>”添加更多存储库作为源。

【讨论】:

  • 如何仅获取/合并某个目录中文件的源。 (这很难解释)。更明确地说:如果我有文件夹“proj1”和“proj2”,以及每个文件夹的遥控器,我如何告诉远程 proj2 上的 fetch 它的源根是 /prog2?
  • subtree merge... 或 子模块
【解决方案3】:

有一种可能性我从未“真正”尝试过,但它可能会奏效。

假设您有三个创造性地命名为 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,然后你会去 whole thing 然后 git commit 它(现在 git 将能够看到 Proj1 已被修改)。

使用这种方法,整个事件的历史会简单地说明 ProjX 何时被修改,但它不会直接跟踪单个文件。但是,正如预期的那样,ProjX 上的存储库会像往常一样跟踪每个文件。

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

祝你好运!

【讨论】:

  • hmm,git 命令如何知道“整个事情”和每个子 repo 之间的区别?我怀疑它可能会有点混乱。您之前是否尝试过 repo 中的 repo?
  • 不会混淆:在查找repo时,git会在当前目录查找;如果里面没有“.git”目录,它会上一层,并再次寻找存储库(“.git”目录),直到找到第一个存储库。所以,你是安全的。
【解决方案4】:

我想我应该使用subtree merge strategy。我将不得不实际尝试一下,看看它是否运作良好。如果事实证明这是一个好方法,我会将这个答案标记为已接受。

与此同时,我仍然愿意接受建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-12
    • 2011-12-20
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多