Git子模块工作流程建议

时间:2012-02-23 10:40:26

标签: php git github fuelphp

所以我几天前开始使用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 /开始开始? 其他分支(1.1/master1.0/develop等。)。
  4. 为什么我们不能在第11步称它为一天?子模块推动工作正常。我之后推动了超级因为手册tells me it's a good idea。事实上,前往GitHub并观察MY super,我们做出了承诺。 This commit 845de87然而,似乎只是对Fuel的超级而非MY超级的参考。它不应该链接到MY repo而不是它们吗?
  5. 在超级节目中运行cat .git/config
  6. 与所有子模块一起......

    [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上的回购是否明智?无论如何,燃料拒绝推动。如果我执行子模块更新,它们会被覆盖吗?

    我也曾在Fuel's Forums问过这个问题,但这更像是一个普遍的问题,这里有更多的叮当声......感谢!

1 个答案:

答案 0 :(得分:10)

  1. 是的,正如“true nature of submodules

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

  4. 请参阅2. git branch中列出的其他分支是子模块存储库中存在的本地分支,如果您执行了tracking branch,则包括每个forks的一个本地分支git pull 1}}在一点上。

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

  6. 使用Changing remote repository for a git submodule可能会有所帮助 请参阅“{{3}}”以更新子模块远程网址。