(Git 2.22、2019年第2四半期に導入git submodule set-branch --branch aBranch -- <submodule_path>
)
まだブランチを追跡していない既存のサブモジュールがある場合は、次のように注意してください(git 1.8.2+を使用している場合):
親リポジトリが、そのサブモジュールがブランチを追跡するようになったことを確認してください。
cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>
サブモジュールが実際にそのブランチの最新のものであることを確認してください:
cd path/to/your/submodule
git checkout -b branch --track origin/branch
# if the master branch already exist:
git branch -u origin/master master
( 'origin'は、サブモジュールが複製された上流のリモートリポジトリの名前です。そのサブモジュール
のgit remote -v
内部に表示されます。通常、 'origin'です)
親リポジトリにサブモジュールの新しい状態を記録することを忘れないでください:
cd /path/to/your/parent/repo
git add path/to/your/submodule
git commit -m "Make submodule tracking a branch"
そのサブモジュールの後続の更新では、--remote
オプションを使用する必要があります。
# update your submodule
# --remote will also fetch and ensure that
# the latest commit from the branch is used
git submodule update --remote
# to avoid fetching use
git submodule update --remote --no-fetch
Git 2.10+(2016年第3四半期)では.
、ブランチ名として' 'を使用できることに注意してください。
ブランチの名前はforのようsubmodule.<name>.branch
に記録されます。の特別な値は、サブモジュール内のブランチの名前が現在のリポジトリ内の現在のブランチと同じ名前であることを示すために使用されます。.gitmodules
update --remote
.
しかし、LubosDがコメントしたように
ではgit checkout
、従うブランチ名が " .
"の場合、コミットされていない作業が強制終了されます。代わりに
使用してくださいgit switch
。
つまり、Git 2.23(2019年8月)以上です。
「混乱git checkout
」を参照してください
ブランチに続くすべてのサブモジュールを更新したい場合:
git submodule update --recursive --remote
Dan Cameronが彼の回答で指摘しているように、更新された各サブモジュールの結果は、ほとんどの場合、切り離されたHEADになることに注意してください。
(Clintm はコメントで、実行git submodule update --remote
して、結果のsha1がサブモジュールが現在オンになっているブランチと同じである場合、サブモジュールは何もせず、サブモジュールを「そのブランチ」に残し、ヘッドが切り離された状態ではないことに注意しています。 )
ブランチが実際にチェックアウトされていることを確認するため(そして、親リポジトリのサブモジュールを表す特別なエントリの SHA1は変更されません)、彼は次のように提案しています。
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch $branch'
各サブモジュールは引き続き同じSHA1を参照しますが、新しいコミットを行う場合、サブモジュールに追跡させたいブランチによって参照されるため、それらをプッシュすることができます。
サブモジュール内でプッシュした後、親リポジトリに戻って、変更したサブモジュールの新しいSHA1を追加、コミット、プッシュすることを忘れないでください。
使用に注意してください$toplevel
お勧めします、コメントにすることによりアレクサンダーPogrebnyakを。
$toplevel
2010年5月にgit1.7.2で導入されました: commit f030c96。
最上位ディレクトリの絶対パスが含まれます(どこに.gitmodules
あるか)。
dtmland
追加する コメントに:
foreachスクリプトは、ブランチに従わないサブモジュールのチェックアウトに失敗します。
ただし、このコマンドは次の両方を提供します。
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git switch $branch' –
同じコマンドですが読みやすいです:
git submodule foreach -q --recursive \
'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
[ "$branch" = "" ] && \
git checkout master || git switch $branch' –
umläute はコメント内の簡略化されたバージョンでdtmlandのコマンドを改良します:
git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
複数行:
git submodule foreach -q --recursive \
'git switch \
$(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
Git 2.26(2020年第1四半期)より前のバージョンでは、サブモジュールで更新を再帰的にフェッチするように指示されたフェッチは、必然的に大量の出力を生成し、エラーメッセージを見つけるのが難しくなります。
このコマンドは、操作の最後にエラーが発生したサブモジュールを列挙するように教示されています。
Emily Shaffer()によるコミット0222540(2020年1月16日)を参照してください。(合併によりJunio C浜野- -でb5c71ccをコミットする、2020年2月5日)nasamuffin
gitster
fetch
:サブモジュールのフェッチ中の失敗を強調します
サインオフ:Emily Shaffer
多くのサブモジュールがあるときにサブモジュールのフェッチが失敗した場合、1つ以上のフェッチがにフォールバックすると、失敗した唯一のサブモジュールフェッチからのエラーは、他のサブモジュールのアクティビティの下に埋もれfetch-by-oid
ます。
ユーザーが何かがうまくいかなかったことに気づくように、遅れて失敗を呼び出します。
ミューテックスfetch_finish()
によって同期的に呼び出されるだけなので、run_processes_parallel,
周りでは必要ありませんsubmodules_with_errors
。