为多个git项目使用单个git存储库

时间:2011-10-17 18:59:15

标签: git heroku github

我很便宜。我不想支付许多github帐户。

我的项目结构看起来像这样。

  • / repo 是项目根目录。
  • / repo / project1 是我拥有Java项目的地方
  • / repo / herokurails1 是我有一个部署到heroku.com的Ruby / Rails项目(到名为hr1-fubar.heroku.com的heroku应用程序)
  • / repo / herokurails2 是我有另一个部署到heroku.com的Ruby / Rails项目(到一个名为hr2-fubar.heroku.com的heroku应用程序)。

所有项目(project1,herokurails1和herokurails2正在积极开发中)。

我想在一些git主机位置有一个存储库,例如github.com,甚至是办公室里的本地git服务器。每当代码在 / repo / 中的任何地方发生变化时,我希望能够运行“ git push github master ”并拥有我的整个 / repo / 树推到了github。

但是,我还希望能够将我的rails应用程序部署到heroku.com,而无需将整个repo / *树推送到每个heroku应用程序。 e.g。

  • /回购/ herokurails1> git push heroku master 只会将herokurails1项目部署到heroku而不会推送/ repo / *中的任何其他代码
  • /回购/ herokurails2> git push heroku master 只会将herokurails2项目部署到heroku而不会推送/ repo / *中的任何其他代码。

这可能吗?我需要设置一些特殊的东西才能实现这一目标吗?还是我坚持使用多个git存储库?

5 个答案:

答案 0 :(得分:4)

这会很快变得非常笨拙(特别是因为Git不会让你像svn那样推拉子目录)

我会考虑不使用Github来存储项目。 BitbucketCodebaseHQ等工具具有不同的定价模式,可能更适合您,并为您提供所需的简单性。

或者,看看像Gitosis这样的东西,可以通过像Gitlab

这样的工具制作非常Github式的东西。

答案 1 :(得分:2)

可以在本地使用git subtree来维护一个git存储库,该存储库从较大的repo存储库中拆分,并从该拆分存储库中推送。坦率地说,我要么使用Adam Dymitruk suggests之一的免费服务,要么只是向GitHub支付一些费用 - 毕竟它们确实提供了优质的服务......

答案 2 :(得分:1)

如果您愿意,如果您不想支付任何费用,可以使用unfuddle或bitbucket。使用子模块在github上托管大型文件,如图像,第三方dll,视频等。这些将不会持有IP。

答案 3 :(得分:0)

如何将每个单独的项目放在不同的分支中?到目前为止它对我很好。我有一个webProjects的私人仓库,每个分支都从master开始,它有我的web项目模板(也可能是空分支),每次我有新项目我只是创建一个基于master的分支,项目名称和cary工作正常

答案 4 :(得分:0)

这个问题不再有意义,因为GitHub现在允许用户免费拥有无限的存储库,但是无论如何我都会分享我的知识,因为我认为有人会发现这个有趣的。

问题是,您可以拥有一个包含多个项目的存储库,而无需使用git submodule创建任何其他存储库。通常,为了使用git子模块,您必须为每个子模块都有一个存储库,但是我意识到,与其为要包含在存储库中的每个项目创建一个单独的存储库,还可以重用要包含的存储库。像这样投影:

  1. 创建一个存储库,其中将包含GitHub上的多个项目。
    为了得到这个答案,我们假设此存储库位于https://github.com/example/example.git

  2. 在本地克隆该存储库:

    git clone https://github.com/example/example.git
    
  3. 为您要拥有的每个项目创建一个(最好是孤立的)分支:

    git checkout --orphan project_1/master
    git commit -m "First commit of project_1/master"
    git push --set-upstream origin project_1/master
    
    git checkout --orphan project_2/master
    git commit -m "First commit of project_2/master"
    git push --set-upstream origin project_2/master
    
    git checkout --orphan project_3/master
    git commit -m "First commit of project_3/master"
    git push --set-upstream origin project_3/master
    
  4. 在分支母版中为每个项目添加一个子模块,指定正确的分支

    git checkout master
    git submodule add --branch project_1/master -- https://github.com/example/example.git project_1
    git submodule add --branch project_2/master -- https://github.com/example/example.git project_2
    git submodule add --branch project_3/master -- https://github.com/example/example.git project_3
    
  5. 提交并推送:

    git commit -m "Added 3 projects to the repository"
    git push
    

现在,您可以像使用各自存储库中的每个项目一样使用该存储库中的每个项目。但是,每次创建新分支时,都必须在项目的分支文件夹下创建它。例如,如果要在project_1中创建分支“ new_feature”,则必须执行以下操作:

git branch 'project_1/new_feature'

如果要在其他任何地方下载项目,则可以:

  • 克隆项目本身,什么也没做:

     git clone --branch project_1 https://github.com/example/example.git ./project_1
    
  • 或者如果您想同时使用多个项目,则克隆整个存储库,然后仅下载实际要使用的项目的内容:

     git clone https://github.com/example/example.git
     git submodule init project_1 project_3
     git submodule update --remote
    

如果您总是将git submodule update--remote一起使用,您可能还想执行以下命令以在您从主存储库git status时停止显示项目的名称:

git submodule foreach 'git -C $toplevel config --file .gitmodules submodule.$name.ignore all'

优势:

  • 您不必每次都想与另一个项目一起签出另一个分支
  • 由于您没有切换分支,因此您也不必处理未跟踪的文件
  • 您实际上仅使用一个存储库。

缺点:

  • 您必须注意在正确的文件夹中创建每个分支。
    您创建了一个名为feature
  • 的分支,而不是project_1/feature

替代项:

  • git subtree:我已经知道此工具是为特定目的而创建的,但是它有一些缺点,我不知道如何使用它。