使用git维护一个多子模块项目

时间:2012-12-14 16:56:24

标签: git github fuelphp

我正在使用FuelPHP框架与另外两名团队成员开发一个网站。我想使用git来维护项目,但是我在配置时遇到了一些问题。当我使用oil安装FuelPHP时,它会安装主框架以及来自github的几个子模块。文档根目录中的.git/config文件如下所示:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = git://github.com/fuel/fuel.git
[branch "1.4/master"]
        remote = origin
        merge = refs/heads/1.4/master
[submodule "docs"]
        url = git://github.com/fuel/docs.git
[submodule "fuel/core"]
        url = git://github.com/fuel/core.git
[submodule "fuel/packages/auth"]
        url = git://github.com/fuel/auth.git
[submodule "fuel/packages/email"]
        url = git://github.com/fuel/email.git
[submodule "fuel/packages/oil"]
        url = git://github.com/fuel/oil.git
[submodule "fuel/packages/orm"]
        url = git://github.com/fuel/orm.git
[submodule "fuel/packages/parser"]
        url = git://github.com/fuel/parser.git

我在远程服务器上设置了裸存储库,我想维护这个项目。我希望能够从github获取FuelPHP及其子模块的更新,同时还能够将任何更改推送到裸存储库,以便我的团队成员和生产服务器可以从中获取。到目前为止,我遇到了一堵砖墙。

这是我到目前为止所做的:

在服务器上:

$ mkdir websitename.git
$ cd websitename.git
$ git init --bare

在我的本地机器上:

$ curl get.fuelphp.com/oil | sh
$ oil create websitename
$ cd websitename/
$ git remote add reponame ssh://git@example.com:2222/httpd/www/websitename.git
$ git push reponame 1.4/master

我收到了这个回复:

Counting objects: 14422, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4375/4375), done.
Writing objects: 100% (14422/14422), 2.20 MiB | 3.82 MiB/s, done.
Total 14422 (delta 9816), reused 14410 (delta 9810)
To ssh://haroldbr@haroldinc.com:2222/home/haroldbr/public_html/crude.git
 * [new branch]      1.4/master -> 1.4/master

然后,再次在服务器上:

$ git clone -l --no-hardlinks /httpd/www/websitename.git /httpd/www/websitename

这给了我这个错误:

Cloning into 'websitename'...
done.
warning: remote HEAD refers to nonexistent ref, unable to checkout.

显然我有配置问题,但我不知道它是什么。我希望能够使用git更新远程存储库中的所有文件。我设想它的工作方式如下:

在我的本地机器上:

$ git pull origin 1.4/master
$ git push reponame --all

在服务器上:

$ cd websitename/
$ git pull

在一个完美的世界中,这将从github获取FuelPHP及其包的所有更新,并将所有这些更新以及对app/public/中的文件的任何更改推送到裸存储库。我正在努力做甚么可能吗?我是否需要在app/public/中设置存储库并单独维护?我的配置有什么问题,我无法从裸仓库中克隆出来?

2 个答案:

答案 0 :(得分:2)

有关于如何使用git维护FuelPHP网站项目的截屏视频:http://blip.tv/fuelphp/creating-a-fuelphp-application-repository-5688973,但它不包括推送到裸存储库。

假设您已经在ssh://example.com/path/to/project.git上安装了新的裸存储库,则可以按照以下步骤设置项目。从您当地的机器:

git clone -b 1.4/master --recursive git://github.com/fuel/fuel.git /path/to/project
cd /path/to/project
rm -R .git
rm .gitmodules
rm -R docs
git init
git submodule add git://github.com/fuel/core.git fuel/core
git submodule add git://github.com/fuel/auth.git fuel/packages/auth
git submodule add git://github.com/fuel/email.git fuel/packages/email
git submodule add git://github.com/fuel/oil.git fuel/packages/oil
git submodule add git://github.com/fuel/orm.git fuel/packages/orm
git submodule add git://github.com/fuel/parser.git fuel/packages/parser
git add .
git commit -m "Initial commit"
git remote add origin master ssh://example.com/path/to/project.git
git push origin master

然后,您可以通过递归方式转到生产服务器并从远程存储库克隆以获取整个项目:

git clone --recursive ssh://example.com/path/to/project.git /path/to/production

然后,您将能够跟踪项目的更改,同时保持以下能力:

git submodule update --recursive

可让您及时了解最新的FuelPHP软件包。

答案 1 :(得分:0)

您正在成功克隆,但您只需要检查您想要的分支。由于您没有在裸仓库上定义头部,因此它会向您发出警告。

此外,git clone --recursive应该完成一次,这也将获得您的子模块。从那时起,您可以git pull后跟git submodule update