12

そこで、数日前に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. なぜgit1.1/developはサブモジュールのブランチをプルダウンしますが*no branch、デフォルトでオンに設定しているのですか?この動作を変更できますか?
  3. 燃料サブモジュールのどの部分がgitに1.1/developを最初にプルするように指示しますか?他ブランチ(1.1/masterなど1.0/develop)があります。
  4. ステップ11で1日と呼べないのはなぜですか?サブモジュールプッシュは正常に機能しました。マニュアルにいいアイデアだと書いてあるので、後でスーパーをプッシュします。そして実際、GitHubに向かい、MYスーパーを見ると、コミットが行われます。ただし、このコミット845de87は、MYスーパーではなく、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の自分のリポジトリに変更するのが賢明でしょうか?とにかく燃料はプッシュを拒否します。サブモジュールの更新を実行すると、それらは上書きされますか?

私はFuelのフォーラムでもこれについて質問しましたが、それはより一般的な質問であり、ここにはもっと多くのGittersがあります...ありがとう!

4

1 に答える 1

15
  1. はい、「サブモジュールの本質」で説明されているよう

  2. gitサブモジュールは特定のコミット(SHA1)への参照であり、ブランチではないため、最初は常にデタッチモードになります(読み取り専用の使用法と互換性があります)。
    つまり、git submodule updateブランチの先端ではなく、特定のコミットをチェックアウトします。
    この.gitmoduleファイルには、サブモジュールリポジトリの参照が含まれます。また、特定のSHA1は、特別なコミット(モード160000)として親リポジトリに記録されます。' git submodule add'新しいサブモジュールを作成すると、他のリポジトリが現在チェックアウトされているSHA1が記録されます(そのブランチが何であれ)。
    変更を加える場合は、そのサブモジュールリポジトリ内のブランチをチェックアウトする必要があります(既存のブランチまたは新しいブランチ:どちらの場合も、新しい変更をそのサブモジュールのリモートリポジトリにプッシュバックします)。
    別の方法はgitslaveです。

  3. 2.にリストされている他のブランチは、サブモジュールリポジトリに存在するローカルブランチであり、ある時点で実行した場合は、トラッキングブランチgit branchごとに1つのローカルブランチが含まれます。 git pull

  4. 親はまだサブモジュールの最初のSHA1を参照しているためです。
    ただし、変更を加えたため、そのSHA1を更新する必要があります。
    サブモジュールはそれ自体がgitリポジトリであることに注意してください...サブモジュールとして使用されているかどうかはまったくわかりません。したがって、そのリポジトリの新しい状態を親リポジトリ(そのサブモジュールの状態を追跡している唯一のリポジトリ)に記録する必要があります。
    最初のgitpushは、完全にサブモジュールリポジトリの内部操作です(これは親リポジトリにはまったく表示されません)。
    親リポジトリの場合、サブモジュールリポジトリは「ブラックボックス」であり、リモートアドレスとSHA1のみが含まれます。サブモジュール内で行われることは、サブモジュールツリーのSHA1の変更のみを検出する親には影響しません。

  5. フォークを使用すると、サブモジュールのリモートURLを更新するための「gitサブモジュールのリモートリポジトリの変更」を
    参照してください。

于 2012-02-23T11:15:35.490 に答える