【问题标题】:Maintaining a multi-submodule project using git使用 git 维护多子模块项目
【发布时间】:2012-12-14 16:56:24
【问题描述】:

我正在与其他两个团队成员一起使用 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/ 中设置存储库并分别维护它们?我无法从裸仓库克隆的配置有什么问题?

【问题讨论】:

    标签: git github fuelphp


    【解决方案1】:

    这里有一个关于如何使用 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 软件包。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我试过git clone --recursive --no-hardlinks -l websitename.git websitename,它给了我这个错误:Cloning into 'websitename'... done. Submodule 'fuel/core' (git://github.com/fuel/core.git) registered for path 'fuel/core' Cloning into 'fuel/core'... fatal: unable to connect to github.com: github.com[0: 207.97.227.239]: errno=Connection refused Clone of 'git://github.com/fuel/core.git' into submodule path 'fuel/core' failed
      • 您在该机器上没有连接到 github 的密钥。所以,不递归地克隆,然后git submodule init,然后使用sed 将url 更改为只读形式,然后git submodule update。如果您不打算为燃料做出贡献,那么您不妨只使用 url 的只读形式,服务器将能够将其拉下。 HTTP 表单会执行此操作。
      • 我使用了git clone --no-hardlinks -l websitename.git websitename。然后cd websitenamefind . -exec grep "git://" '{}' \; -exec sed -i 's/git:\/\//http:\/\//' '{}' \;git:// 替换为http://。我跑了git submodule initgit submodule update,它成功地让我从github 克隆了燃料芯。但是,我的服务器存储库仍然看起来不像我的本地存储库。我可以创建一个文件,暂存它,提交它,然后推送到裸仓库。但是,当我尝试拉到实时服务器时,它告诉我Already up-to-date. 我需要更改分支名称吗?
      • 是的,克隆后,请确保设置跟踪,以便拉取操作。 git branch --set-upstream origin/master。现在 pull 应该可以工作了。
      猜你喜欢
      • 2021-12-02
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 2021-08-09
      • 2020-05-28
      相关资源
      最近更新 更多