Git子模块工作流建议


Git Submodule Workflow Advice

所以我几天前就开始使用Git了。(聚会很晚-不要骂:))。真正开始适应基本的命令、想法和工作流程。然而,子模块真的让我的大脑兴奋不已。我正在尝试为FuelPHP的GitHub贡献代码,我可以使用一些指导和技巧。

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

//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. 燃料子模块的哪个部分告诉git从1.1/develop开始?还有其他分支(1.1/master1.0/develop等)
  4. 为什么我们不能在第11步到此为止?子模块推送工作良好。之后我推超级,因为手册告诉我这是个好主意。事实上,转到GitHub,看看MY super,就做出了承诺。然而,这个提交845de87似乎只是参考了Fuel的super,而不是MY super。它不应该链接到我的回购而不是他们的回购吗
  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

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

我也在Fuel的论坛上问过这个问题,但这更多的是一个一般性的问题,这里有更多的Gitter。。。谢谢!

  1. 是的,如"子模块的真实性质"中所述

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

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

  4. 因为父模块仍然引用子模块的初始SHA1
    但是,由于您在其中进行了修改,因此需要更新SHA1
    请记住,子模块本身就是一个git-reo。。。毫无疑问,它被用作子模块。因此,有必要在父回购中记录该回购的新状态(唯一一个跟踪其子模块状态的回购)
    您的第一次git推送完全是子模块repo的内部操作(父repo根本看不到)
    对于父repo,子模块repo是一个"黑匣子",只有一个远程地址和一个SHA1。在子模块内所做的任何事情都不会对父模块产生影响,父模块将只检测子模块树的SHA1的变化。

  5. 使用叉子可能会有所帮助
    请参阅"更改git子模块的远程存储库"以更新您的子模块远程URL。