具有复杂项目结构的Git / Hg存储库

时间:2012-01-20 04:04:27

标签: git version-control mercurial dvcs

目前我们正在使用SVN(是的,我知道这很遗憾:))我们正在检查移动Git或Hg的可能性。 目前我们有一个svn回购,结构如下:

Platform 1-
          . Country 1
                    . Customer A
                               . Project Z
                               . Project Y
                    . Customer B
                               . Project X
          . Country 2
                    . Customer C
                               . Project W
Platform 2 
          . Country 1

我们只有2个顶级“平台”,但国家,客户和特别项目的数量相当高(我确定项目数量> 100)。 这种结构对我们来说非常方便,因为很容易找到必要的项目(因为开发人员知道平台,国家和客户)。由于通常开发人员可以在1周内切换项目几次,因此该组织非常重要。

基本用例:

  1. 工程师收到项目描述(通常是某人已经在项目上工作过)
  2. 工程师在他的硬盘上有完整的SVN repo副本。他前往必要的国家/客户,并为客户文件夹(如果他没有项目)或项目文件夹(如果他之前已经检查过)执行 SVN更新
  3. 用户在项目上工作,并通过提交整个项目文件夹来提交。
  4. 有些人只是浏览TortoiseSVN Repo Browser,找到必要的项目并查看。

    所以现在我们需要一些简单但有Git / Hg的东西。正如我在Git中所理解的那样,非常常见的模式 - 1 Repo / 1 Project。所以问题是:

    1. 有没有办法在Git / Hg中对回购进行分类?
    2. 有没有办法通过GUI(Win)浏览回购并拉出必要的一个?
    3. 您有任何关于如何使用Git / Hg组织我们的回购的提议吗?
    4. 我创建了BitBucket Git repo来玩它,但现在还不明白我如何组织我们的项目。

      只有一个注意事项 - 分支对我们来说并不常见,因为项目在开发方面相当小。

4 个答案:

答案 0 :(得分:4)

  

正如我在Git中所理解的那样,非常常见的模式 - 1 Repo / 1 Project。

这不仅非常普遍,当您使用像Mercurial或Git这样的分布式版本控制系统时,它几乎是强制性的。原因是两个系统都不支持narrow clones,也就是克隆,您只下载属于较大存储库中某个子目录的历史记录。所以你需要检查一切只是为了获得存储库的一小部分。

每个项目创建一个存储库。您可以通过创建与今天类似的文件夹结构将项目组织到组中。文件夹结构不在任何存储库中 - 它只是一种对相关存储库进行分组的方法。

Kallithea等工具也可以将您的组织存储库放在层次结构组中。这将让您的用户以方便的方式浏览存储库。

所以,问题是:

  
      
  1. 有没有办法在Git / Hg中对回购进行分类?
  2.   
  3. 有没有办法通过GUI(Win)浏览回购并拉出必要的一个?
  4.   
  5. 您有任何关于如何使用Git / Hg组织我们的回购的提议吗?
  6.   

总结上面的答案:是的,您可以组织存储库。您可以在文件系统级别上将它们放入目录结构中,并且可以使用合适的存储库管理器在HTTP级别上执行此操作。

如何浏览存储库以找到正确的存储库取决于组织。共享存储库的推荐方法是HTTP,然后“打开存储库”对话框将不允许您在文件夹中浏览 - 因为文件夹仅存在于由Kallithea提供的URL中。因此,您的工程师通常会在浏览器中浏览存储库结构,然后将正确的URL复制粘贴到TortoiseHg

当他们从服务器克隆时,工程师应该将本地克隆放入与服务器上的克隆匹配的层次结构中。此层次结构将使用其本地磁盘上的目录完成。然后,他们可以像平常一样使用Windows资源管理器浏览此层次结构。

答案 1 :(得分:2)

最简单的选择是你只需要为项目使用一个git存储库,就像你使用subversion一样。

优点:和你一样。缺点:更新任何更新存储库所有部分的部分;没有像SVN这样的“仅此处”更新。

通常,如果平台,国家和项目完全独立,我建议您的工程师在本地创建该结构,并命名您的存储库${platform}-${country}-${project}以保留该详细信息。

如果您愿意,您可以明显编写结帐流程脚本以构建该结构,如果您愿意,可以查看mr之类的工具或其他旨在从单个位置处理多个存储库的工具。< / p>

另一方面,如果您的项目非常相似,您可能会看到分支,也许是git rebase驱动的工作流,这可能会更容易将常见更改合并到您的系统中。

答案 2 :(得分:1)

是的,这是非常常见的,强烈建议每个项目都有一个回购(repos在Git / Hg中比在SVN中更轻量级)。这样,只需要签出(克隆)一个项目的人就可以这样做。否则,每个人都必须克隆整个项目集。然而,想要一切的人将不得不逐个克隆。因此,如果您没有考虑拥有分支机构,您可以将所有项目放在一个仓库中(如果您将它们全部放在一起,则分支不能在项目级别,因此如果您要分支,则每个项目仓库都是必需的。)

根据文件夹对repos进行分类,以便URL显示类似git@host.com/platform1/Country1/CustomerA/project1.git等的分类。请注意,如果您在单个仓库中拥有项目,则无法获得此类URL。您将只有git@host.com/repo.git或类似的东西。

查看权衡并决定或一个回购或多个回购。您甚至可能希望按平台等而不是项目进行分组。

您可以使用GitWeb或cgit等网络界面浏览回购。

答案 3 :(得分:1)

您希望每个项目都有一个回购。这样可以减少在项目工作时保持本地所需的数据量:与SVN不同,您可以获得每个repo副本中每个更改的完整历史记录。在执行git log时,它还使得一个项目的提交不会散布来自另一个项目的提交。

然后添加顶级仓库以处理您的顶级结构。在该repo中,为每个叶子仓库添加git子模块。人们总是开始克隆/拉取顶级结构,然后只使用git submodule updategit pull检查项目所需的项目。

顶级项目将跟踪子模块的头部哈希值,您可以使用或不使用它们,具体取决于您的偏好。