在Git中使用多个源代码库

时间:2013-11-21 19:14:12

标签: git codeigniter

我有一个新项目将使用Codeigniter作为框架,Flexiauth用于用户登录的东西,然后我自己的应用程序的自定义代码。 codeigniter和flexiauth都使用Git,我希望能够从这些代码中获取最新信息。

我是否将每个添加为单独的远程存储库并且只是拉动?不会造成冲突吗?

有没有更好的方法来处理多个git存储库作为更大项目的组件?

2 个答案:

答案 0 :(得分:2)

是的,有。 Git支持submodules

我建议将the relevant section of the Pro Git book online作为解决此问题的良好起点,但基本思路是使用以下语法添加子模块:

git submodule add git://github.com/chneukirchen/rack.git rack

其中rack是您要设置为子模块的文件夹。克隆repo时,需要在克隆后运行以下命令以获取子模块:

git submodule init
git submodule update

这样,您可以将第三方库完全保留在您的仓库中,并仅将其记录为子模块。

或者,这是Composer要解决的问题。 Laravel 4框架实际上是以这样的方式构建的,即所有组件都与Composer一起安装,您只需运行composer update即可全部更新它们。你可以想象使用Composer和CodeIgniter(Phil Sturgeon在http://philsturgeon.co.uk/blog/2012/05/composer-with-codeigniter写了一篇关于这样做的博客文章),但是Flexiauth没有出现在https://packagist.org/的存储库中,所以我会选择使用Git子模块。

答案 1 :(得分:1)

我不是git专家,它可能不正确,但我要做的是在external_librarythird_party或您导入到的某个文件夹中为库启动git repo你的项目。然后,当需要更新时,请进入文件夹>项目文件夹并执行git pull origin master或任何您命名的内容。

我认为在git中使用git是典型的,例如:

myproject
    .git <- root repo for whole project
    application
    system
    third_pary
        cool_library
            .git <- repo for cool_library
            cool_folder
                some_lib.php
        other_cool_library
            .git <- repo for other_cool_library
            neat_libs
                neato.php

myproject的根目录中,git命令只会影响myproject的repo。所以

$cd myproject
myproject$ git commit -a -m"neat"

会将更改提交到您的myproject回购协议;提交的所有文件夹中的所有更改(但是,如果您对/myproject/third_party/cool_library/cool_folder/some_lib.php进行了更改,则应在进入/myproject/third_party/cool_library/之前进入git commit并执行/myproject/

至于拉动:

$cd myproject
myproject$ git pull origin master

将进入myproject; .git文件夹中的其他third_party将不受影响(当然,除非其他人将更改推送到myproject回购更改为third_party

所以,tl; dr,拉入你的项目根目录不会导致子文件夹repos从它们的起源拉出来。当您需要更新时,请切换到库的目录并执行拉动。

换句话说,鉴于上述文件结构,如果刚出现cool_library的更新,我就会这样做:

$cd myproject
myproject$ git commit -a -m"committing before updating cool_library"
myproject$ cd third_party/cool_library
cool_library$ git pull origin master
cool_library$ cd ../../
myproject$ git commit -a -m"commiting after updating cool_library"