【问题标题】:multiple git repositories cloned into the same directory [duplicate]克隆到同一目录中的多个 git 存储库 [重复]
【发布时间】:2012-11-12 23:55:37
【问题描述】:

我的项目有一个标准存储库

/home/repo/.git  

这是我克隆的存储库,用于获取新网站的基本代码 即我将其克隆到

/var/www/site1

我还创建了几个模块作为存储库,有些网站会使用这些模块,有些则不会。

/home/modules/mod1/.git  
/home/modules/mod2/.git

有没有办法可以将这些模块克隆到同一个站点文件夹中?

/var/www/site1  

模块目录设置为与主存储库相同的文件夹结构,当我将它们克隆到主存储库克隆之上时,它们应该合并/替换现有文件。 (很少有文件重叠)

我的最佳解决方案是以某种方式命名 repo,这样当我部署一个新站点时,我会执行以下操作:

cd /var/www/newsite  
git clone /home/repo/.git  
git clone /home/modules/mod1/.git  
git clone /home/moudles/mod2/.git  

当我要对网站进行更新时,我可以执行以下操作:

git pull origin master  
git pull mod1  
git pull mod2  

或者最好:

git pull origin master 

还会调用mod1mod2 的拉动。

我一直在查看 git 子模块和分支,但不知道它们是否是我需要的。

【问题讨论】:

  • 请用 4 个空格识别代码/命令并进行拼写检查。顺便说一句,在英语中,“I”总是大写的。

标签: git multiple-repositories


【解决方案1】:

以下是对您所需部署命令的建议稍作改动:

cd /var/www/  
git clone /home/repo/.git newsite
git remote add mod1 /home/modules/mod1/.git  
git remote add mod2 /home/moudles/mod2/.git  

cd newsite
git merge mod1/master
git merge mod2/master

解释:

如您所说,您的主模块(/home/repo)和您的mod1mod2 等具有相同的文件夹结构。那么子模块就不太合适了,因为子模块必须位于主存储库的子目录中。在这个版本中,您的本地 git 存储库(由 clone 创建)知道三个远程存储库。在merge 操作之后,它的状态将与它们中的任何一个都不相同。 mod1 的merge 将引入mod1“拥有”的任何新文件。如果home/repo 中的任何文件与mod1 中的文件具有相同的名称等,您可能会遇到合并冲突。您可以向merge 提供一个标志以始终从mod1 中选择版本,我相信您说的是你想要的行为。

【讨论】:

  • 您必须先 cd 进入存储库,然后才能添加遥控器。此外,您必须先获取,然后才能合并;)——但我认为这对 OP 来说效果不佳,因为问题提到“很少有任何文件重叠”(这告诉我,有重叠)。
  • 我认为这对项目来说非常有效。当您说我可以“提供一个标志以合并以始终从 mod1 中选择版本”时,是否会包括 mod2 中的所有文件,除了重叠文件?还是会完全从合并中消除 mod2?
【解决方案2】:

简而言之,您不能将一个 git 存储库作为另一个 git 存储库的子目录。

此规则有一个例外:您可以将一个 git repo 用作另一个的 submodule,但这有很多限制和不便。

解决此问题的一般方法是拥有一个没有自己的实际修道院的主 git 存储库,但仅跟踪少数 git 存储库作为其子模块。

或者,我建议使用由 Android 项目专门为此目的开发的 repo 工具。它涉及创建仅包含一个 XML 文件(称为清单)的小型 git 存储库,该文件跟踪您的子项目签入的位置以及它们如何粘合在一起。这在 Linux 和 Mac 上运行良好,但不幸的是不支持 Windows(repo 需要操作系统的符号链接支持)。

从某种意义上说,git 子模块和 android repo 解决了本质上相同的任务,但使用的方式略有不同。

【讨论】:

  • “这条规则有一个例外” - 两个。并且 git-tree 是子模块的更好替代品
  • git-subtree,对不起 - github.com/apenwarr/git-subtree
  • git-subtree 一样好,它仍然无法替换您需要且完全不受您控制的外部 git 存储库(无需更改提交 ID 和来回合并的必要性)。此外,即使在最新的 git 中,默认情况下也不会启用它
【解决方案3】:

vcsh 工具允许在同一目录中维护多个存储库。

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2015-08-13
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    相关资源
    最近更新 更多