使用单个git仓库管理多个git项目

10

我比较抠门,不想为多个Github账户付费。

我的项目结构大概是这样的:

  • /repo 是项目根目录
  • /repo/project1 是一个Java项目
  • /repo/herokurails1 是一个Ruby/Rails项目,部署在heroku.com上(heroku app名为hr1-fubar.heroku.com)
  • /repo/herokurails2 是另一个Ruby/Rails项目,也部署在heroku.com上(heroku app名为hr2-fubar.heroku.com)

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

我想在像github.com这样的git托管平台或者甚至办公室里的本地git服务器上拥有一个仓库。每当代码在/repo/任何一个地方更改时,我希望能够运行"git push github master",并将我的整个/repo/树推送到github。

然而,我也想能够将我的Rails应用程序部署到heroku.com,而不必将整个repo/*树推送到每个Heroku应用程序中。例如:

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

这个可行吗?我需要设置什么特殊的东西来实现吗?还是我只能使用多个git存储库呢?


6
试试 BitBucket 吧。他们支持免费、无限制、私有的代码仓库,并且最近添加了 Git 支持。 - vcsjones
可能是 在 Heroku 上部署子目录的问题 的重复。 - millimoose
4
把多个项目塞到一个Git仓库不是好主意,不要这样做。 - Lily Ballard
3
GitHub 的商业账户受空间限制,而非仓库数量限制。您可以在一个账户下拥有多个仓库。 - Matt Greer
3
我猜测作者所说的是GitHub上的私有仓库,这些仓库在每个套餐下都有数量限制。 - Mark Longair
@Mark Longair。是的,你说得对。但即使是微型计划,仍然至少允许5个存储库。 - Matt Greer
5个回答

5
这将很快变得非常棘手(特别是因为 Git 不像 svn 那样允许您推送拉取子目录)。
我建议不要使用 Github 存储项目。例如,Bitbucket 或者 CodebaseHQ 这样的工具有不同的定价模型,也许更适合您,而且很容易使用。
或者,考虑使用 Gitosis,可以通过Gitlab等工具实现类似于 Github 的功能。

2
你可以使用git subtree在本地维护一个从你的大型repo仓库分离出来的git仓库,并从该分离的仓库推送。不过,坦率地说,我要么使用Adam Dymitruk建议的免费服务之一,要么只需多付点钱给GitHub——毕竟他们提供了优秀的服务...

我很吝啬。但我的更强动力是能够将一个项目部署到Heroku,而不必同时部署存储库中的所有内容。 - Jay Godse
在这种情况下,我会尝试使用git subtree - 这听起来很适合你想要做的事情。 - Mark Longair

1

如果你想的话,可以使用Unfuddle或Bitbucket,如果你不想支付任何费用。在GitHub上使用子模块来托管大文件,例如图像、第三方dll、视频等。这些将不会持有任何知识产权。


0
怎么样把每个单独的项目放在不同的分支里?这对我来说一直很有效。我有一个私人仓库用于Web项目,每个分支都以主分支开始,其中包含我的Web项目模板(也可以是空分支),每当我有新项目时,我只需创建一个基于主分支的带有项目名称的分支,并继续良好地工作。

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
    

If you are always going to git submodule update with --remote you might want to also execute this command to stop showing the projects's name when you git status from the main repository:

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

优点:

  • 您无需每次想要使用另一个项目时都要检出另一个分支
  • 由于您不必切换分支,因此也不必处理未跟踪的文件
  • 您只需有效地使用一个存储库。

缺点:

  • 您必须小心在正确的文件夹中创建每个分支。
    而不是创建名为feature的分支,您需要创建名为project_1/feature的分支

替代方案:

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

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