【问题标题】:Git Submodule Workflow AdviceGit 子模块工作流程建议
【发布时间】:2012-03-13 18:14:06
【问题描述】:

所以我几天前开始使用 Git。 (晚会很晚 - 不要责骂 :))。真正开始熟悉基本的命令、想法和工作流程。然而,子模块真的让我大吃一惊。我正在尝试为FuelPHPGitHub 贡献代码,我可以使用一些指导和技巧。

我正在终端中运行以下命令:

//1: clone the repository from Fuel's github.
git clone git://github.com/fuel/fuel.git

//2: move into the main fuel directory
cd fuel

//3: initilize the submodules (populate .git/config with submodule data)
git submodule init

//4: download the submodules...
git submodule update

//5: move into the core directory (which is a submodule).
cd fuel/core

//6: change branch from (*no branch) to 1.1/develop
git checkout 1.1/develop

//7: open random file in text editor + make some small change (i.e. typo) + save file.
sudo gedit classes/autoloader.php

//8: add this file to the staging area.
git add classes/autoloader.php

//9: commit this file under 1.1develop branch.
git commit -m "im committing a submodule"

//10: push the new commit to MY (not fuel's) github repo (yes i've renamed the repo).
git push git@github.com:jordanarseno/fuel-core.git

//11: changes are reflected on github, looks good.

//12: back way out to fuel again. time to push the submodule commit separately.
cd ../../

//13: add the fuel/core submodule to the staging area.
git add fuel/core

//14: commit the submodule change.
git commit -m "submodule pushed. pushing super now."

//15: push the commit to MY (not fuel's) github repo.
git push git@github.com:jordanarseno/fuel.git

具体来说,我的问题是:

  1. 这是处理子模块的正确工作流程吗?你会这样做吗?
  2. 为什么 git 拉下子模块中的1.1/develop 分支,但默认设置为*no branch?我可以修改这种行为吗?
  3. Fuel 子模块的哪一部分告诉 git 从拉 1.1/develop 开始? 还有其他分支(1.1/master1.0/develop 等)。
  4. 为什么我们不能在第 11 步收工?子模块推送工作正常。之后我推超级因为手册tells me it's a good idea。事实上,前往 GitHub 并查看 MY super,提交了一个。 This commit 845de87 然而,似乎只是参考 Fuel 的超级而不是我的超级。它不应该链接到我的仓库而不是他们的吗?
  5. 在超级节目中运行cat .git/config

连同所有的子模块...

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = git://github.com/fuel/fuel.git`

在核心子模块中运行cat .git config显示:

[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = git://github.com/fuel/core.git

将这些 url 更改为我自己在 GitHub 上的 repo 是否明智?无论如何,燃料否认推动。如果我执行子模块更新,它们会被覆盖吗?

我也在 Fuel's Forums 上问过这个问题,但这是一个更笼统的问题,这里有更多的 Gitters...谢谢!

【问题讨论】:

    标签: php git github fuelphp


    【解决方案1】:
    1. 是的,如“true nature of submodules”中所述

    2. git 子模块是对特定提交 (SHA1) 的引用,而不是分支,因此您始终首先处于分离模式(与只读用法兼容)。
      换句话说,git submodule update 签出一个特定的提交,而不是一个分支的尖端。
      .gitmodule 文件将包含您的子模块 repo 的引用。并且特定的 SHA1 将作为特殊提交(模式 160000)记录在父 repo 中。当您“git submodule add”一个新的子模块时,它会记录当前签出其他存储库的 SHA1(无论其分支)。
      如果要进行更改,则必须签出该子模块存储库中的分支(现有分支或新分支:在这两种情况下,您都会将任何新更改推送回该远程存储库子模块)。
      另一种选择是git slave

    3. 参见 2。git branch 中列出的其他分支是您的子模块存储库中存在的本地分支,如果您在某个时间点执行了 git pull,则包括每个 tracking branch 的一个本地分支.

    4. 因为父级仍然引用子模块的初始SHA1。
      但是由于您已经对其进行了修改,因此需要更新 SHA1。
      请记住,子模块本身就是一个 git repo……绝对不知道它被用作子模块。因此,有必要在父 repo 中记录该 repo 的新状态(唯一一个跟踪其子模块状态的)。
      您的第一个 git push 完全是子模块 repo 的 internal 操作(父 repo 根本看不到)。
      对于父 repo,子模块 repo 是一个“黑匣子”,只有一个远程地址和一个 SHA1。子模块内所做的任何事情都不会对父模块产生任何影响,它只会检测到子模块树的 SHA1 的变化。

    5. 使用forks 可能会有所帮助
      请参阅“Changing remote repository for a git submodule”以更新您的子模块远程 URL。

    【讨论】:

    • 非常感谢!另一个线程中的优秀帖子。回复:2;如何找到子模块引用的特定提交?您说“必须在该子模块 repo 中签出一个分支”——它必须是一个 existing 分支吗?我可以创建自己的并从那里工作,是吗?回复:3;在子模块中运行 git branch 会返回 *no branch 等。我想知道这些“其他人”从何而来。回复:4;运行第二个 git push 应该已经完成​​了这个..你是说它失败了吗?回复:5;是的,就是这样。 fork,然后更改网址。 git submodule update 会覆盖吗?
    • @JordanArsenault:我已经编辑了我的答案以解决您的评论:stackoverflow.com/posts/9411932/revisions
    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多