.gitmodules
ファイルの内容の一部を次に示します。
[submodule "src/static_management"]
path = src/static_management
url = git://github.com/eykd/Django-static-management.git
[submodule "external/pyfacebook"]
path = external/pyfacebook
url = http://github.com/sciyoshi/pyfacebook.git
ただし、.git/config
には最初のもののみが含まれます。
[submodule "src/static_management"]
url = git://github.com/eykd/Django-static-management.git
2番目のサブモジュール(external/pyfacebook
)は、機能ブランチで別の開発者によって追加されました。私は開発を継承し、機能ブランチをチェックアウトしました。ただし、Gitはサブモジュールをプルしません。私はもう試した:
git submodule init
git submodule update
git submodule update --init
git submodule sync
.git/config
からすべてのサブモジュール定義を削除し、git submodule init
を実行しています。以前に存在していたサブモジュールのみをコピーし、新しいサブモジュールを無視します。.git/config
に新しいサブモジュール定義を手動で入力し、git submodule update
を実行します。既存のサブモジュールのみが更新の手間がかかります。さまざまな組み合わせですが、gitは.git/config
の新しいコンテンツに基づいて.gitmodules
を更新するだけでなく、external/pyfacebook
フォルダーを作成してサブモジュールのコンテンツをプルすることもありません。
私は何が欠けていますか?手動による介入(サブモジュールエントリを手動で.git/config
に追加)が本当に必要ですか?
編集:手動介入は機能しません。新しいサブモジュールエントリを.git/config
に手動で追加しても、何も起こりません。新しいサブモジュールは無視されます。
最近gitバージョン1.7.0.4にアップグレードしましたか?私は同じような問題を抱えています...
編集:私は自分の問題を修正しましたが、問題がどこにあるのか全く全く分かりません。 .git/configと.gitmodulesの両方からサブモジュールエントリを手動で削除し、通常の手順でサブモジュールを再追加しました(git submodule add etc ...)... Worksformeですが、このスレッドに値を追加しません。
私はこれと同じ問題を抱えていました-.gitmodulesファイルはコミットされましたが、実際のサブモジュールコミット(つまり、サブモジュールのコミットIDの記録)はコミットされていませんでした。
それを手動で追加することは、トリックを行うように見えました-例えば:
git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook
(.git/configまたは.gitmodulesから何も削除しなくても。)
次に、コミットしてIDを適切に記録します。
この作業中の回答にさらにコメントを追加する:gitサブモジュールのinitまたはgitサブモジュールの更新が機能しない場合、上記のようにgit submodule add urlはトリックを実行する必要があります。これをクロスチェックできます
git config --list
git config --listコマンドの結果を取得するサブモジュールのエントリを取得する必要があります。設定結果にサブモジュールのエントリがある場合、通常のgit submodule update --initがサブモジュールをプルするはずです。この手順をテストするには、サブモジュールの名前を手動で変更してから、サブモジュールを更新します。
mv yourmodulename yourmodulename-temp
git submodule update --init
サブモジュールにローカルな変更があるかどうかを確認するには、git status -u(サブモジュールの変更を表示する場合)またはgit status --ignore-submodules(変更を表示したくない場合)で確認できますサブモジュール)。
gitバージョン2.7.4。このコマンドはローカルコードを更新しますgit submodule update --init --force --remote
Gitがinit
およびupdate
コマンドを無視し、何もしない場合、同じ問題がありました。
修正方法
その要件が満たされていれば機能します。それ以外の場合、すべてのコマンドはメッセージと結果なしで実行されます。
すべてを実行しても、まだ機能しない場合:
git submodule add git@... path/to
git submodule init
git submodule update
.gitmodules
およびモジュールフォルダー(フォルダーのコンテンツはコミットされないことに注意してください).git/config
にはサブモジュールがまだありませんgit submodule init
-モジュールが登録されたというメッセージが表示されますgit submodule update
-モジュールを取得します.git/config
そして、登録されたサブモジュールが見つかります魔法のようですが、今日私は
git submodule init
に続くgit submodule sync
に続くgit submodule update
そして、それは私のサブモジュールを引き出し始めました...マジック?おそらく!これは、Gitで最も迷惑な経験の1つです。
スクラッチ。私は実際にgit submodule update --init --recursive
。お役に立てれば。
PS:サブモジュールではなく、ルートgitディレクトリにいることを確認してください。
ここでも(また)答えには多くの混乱があるようです。
git submodule init
は、not.git/configから(.gitmodulesから)ものを魔法のように生成することを目的としています。親プロジェクトのクローンを作成するか、以前に存在しないサブモジュールを追加するコミットをプルした後、完全に空のサブディレクトリに何かを設定することを目的としています。
言い換えると、サブモジュールを持つプロジェクトのgit clone
(クローンが.gitmodulesファイルをチェックアウトしたという事実からわかる)をgit submodule update --init --recursive
で追跡します。
あなたはするnotgit submodule add ...
にgit submodule init
(またはgit submodule update --init
)を付けて、動作しない。実際、物事が機能する場合、追加はすでに適切な.git/configを更新します。
[〜#〜] edit [〜#〜]
以前に存在しないgitサブモジュールが他の誰かによって追加され、そのコミットのgit pull
を実行すると、そのサブモジュールのディレクトリは完全に空になります(git submodule status
新しいサブモジュールのハッシュを実行すると)表示されるはずですが、その前に-
があります。この場合、git pull
に続いてgit submodule update --init
(さらにサブモジュールの場合は--recursive
)も必要です。サブモジュール内)、以前は存在しなかった新しいサブモジュールをチェックアウトするために;サブモジュールを含むプロジェクトの最初のクローンの後と同じです(明らかに、これらのサブモジュールは以前にはありませんでした)。
同じ問題がありました。
.gitmodules
にはサブモジュールがありましたが、git submodule init
コマンドの後、.git/config
にはありませんでした。
サブモジュールを追加した開発者は、.gitignore
ファイルにサブモジュールディレクトリも追加したことがわかります。それは機能しません。
あなたと同じように、gitサブモジュールの同期は期待どおりに動作しません。明示的なgit submodule add
を再度実行した後にのみ、サブモジュールのURLが変更されます。
そこで、このスクリプトを~/bin/git-submodule-sync.rb
に入れました。
https://Gist.github.com/frimik/5125436
また、いくつかの受信後gitデプロイスクリプトでも同じロジックを使用します。
ここで必要なのは、.gitmodules
を編集してからこのスクリプトを実行するだけで、git submodule sync
が想定されていたように動作します。
今日も同じ問題があり、git submodule init
その後、私の行にそれらの行がありました.git/config
:
[submodule]
active = .
私はそれを削除して入力しました:
git submodule update --init --remote
そして、すべてが正常に戻り、私のサブモジュールはそのサブディレクトリでいつものように更新されました。
Dave James Millerからの回答によれば、それが私にとってうまくいったことを確認できます。ここで重要なことは、サブプロジェクトのコミットIDをコミットすることでした。 .gitmodulesにエントリを置くだけでは不十分でした。
適切なコミットは次のとおりです。
https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae
私は同じ問題を抱えていましたが、上記の解決策のいずれも助けにはなりませんでした。 .gitmodulesと.git/configのエントリは正しいが、コマンドgit submodules update --init --recursive
は何もしていませんでした。また、サブモジュールのディレクトリを削除し、git submodules update --init --recursive
そして、サブモジュールのディレクトリを取り戻しましたが、以前とまったく同じコミットです。
これについての答えを見つけました ページ 。コマンドは:git submodule update --remote
今日私がこれを見たとき、開発者はツリーの一部を新しいサブディレクトリに移動しましたが、彼のgitクライアントは更新されたサブプロジェクトルールをツリーに記録せず、代わりに_Nのままで、.gitmodules
古い場所と、現在のツリーに存在しなくなったサブプロジェクトの両方を参照します。
サブモジュールを再度追加し、サブモジュールのコミットshasをgit show $breaking_commit_sha
(regexp ^-Subproject
に一致する行を検索)で見つかったものと比較して、必要に応じて修正します。
サブモジュールでも同様の問題がありました。クローン/プル/アップデート/その他は何でもしたくありませんでした。
git submodule add [email protected] destination
を使用してサブモジュールを再追加しようとすると、次の出力が表示されました。
A git directory for 'destination' is found locally with remote(s):
Origin [email protected]
If you want to reuse this local git directory instead of cloning again from
[email protected]
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.
そこで、addコマンドを強制するを試みました。git submodule add --force [email protected] destination
私の場合はうまくいきました。
.git/config
からサブモジュールを削除しますgit submodule init
コマンドを実行するgit pull Origin master
を実行します今すぐ動作するはずです
git submodule add ...
の前にサブモジュールdirとそのコンテンツ( "external/pyfacebook"フォルダー)が存在する場合は削除すると問題が解決する場合があります。
記録のために:
サブモジュールとしてempty repositoryを追加して、同じ問題を作成しました。この場合、サブモジュールで使用可能な参照ハッシュがなかったため、元の投稿者が説明したエラーが発生しました。
コミットした後にリポジトリを強制的に追加すると、問題が解決しました(Arvidsの投稿のように)git submodule add --force [email protected] destination
手動で.gitmodules
を設定するだけで十分だと思うのは[〜#〜] wrong [〜#〜]
この執筆時点の私のローカルgit version 2.22.0
。
だから私はこのスレッドに来て、なぜgit submodule init
が動作しなかったのだろうと思った。 .gitmodules
ファイルをセットアップし、git submodule init
を実行しました...
[〜#〜] important [〜#〜]
git submodule add company/project.git includes/project
はrequired(モジュールを初めて追加するとき)、これは次のようになります:
.git/config
に設定を追加します.gitmodules
ファイルを更新しますincludes/project
)を追跡します。あなたはmustそしてサブモジュールを追加した後git commit
、これは.gitmodules
と追跡されたサブモジュールの場所をコミットします。
プロジェクトが再び複製されると、.gitmodules
と空のサブモジュールディレクトリ(この例ではincludes/project
)が作成されます。この時点で、.git/config
にはサブモジュールの設定がありません。git submodule init
が実行されるまで、メインgitリポジトリで.gitmodules
AND includes/project
が追跡されるため、これが機能することを忘れないでください。
また、参照については、以下を参照してください。