(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四半期)では、ブランチ名として''を使用できることに注意してください。
ブランチの名前は、のように記録されsubmodule.<name>.branch
ます。の特別な値は、サブモジュール内のブランチの名前が現在のリポジトリ内の現在のブランチと同じ名前でなければならないことを示すために使用されます。.gitmodules
update --remote
.
しかし、LubosDがコメントしたように
を使用git checkout
すると、フォローするブランチ名が「.
」の場合、コミットされていない作業が強制終了されます。代わりに
使用してください。git switch
つまり、Git 2.23(2019年8月)以上です。
「混乱git checkout
」を参照してください
ブランチに続いてすべてのサブモジュールを更新する場合:
git submodule update --recursive --remote
ダンキャメロンが彼の答えで述べているように、更新されたサブモジュールごとに、結果はほとんどの場合、切り離された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を追加、コミット、およびプッシュすることを忘れないでください。
AlexanderPogrebnyakによるコメント$toplevel
で推奨されているの使用に注意してください。2010年5月にgit1.7.2で導入されました:commitf030c96。
$toplevel
これには、最上位ディレクトリの絶対パスが含まれます(ここで、.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()によるcommit 0222540(2020年1月16日)を参照してください。( Junio C Hamanoによってマージされました---コミットb5c71cc、2020年2月5日)nasamuffin
gitster
fetch
:サブモジュールフェッチ中の失敗を強調する
サインオフ-作成者:Emily Shaffer
サブモジュールの数が多いときにサブモジュールのフェッチが失敗した場合、複数のフェッチがフォールバックすると、失敗した唯一のサブモジュールのフェッチによるエラーが他のサブモジュールのアクティビティに埋もれてしまいますfetch-by-oid
。
何かがうまくいかなかったこと、そしてどこでユーザーが気付くように、遅れて失敗を呼びかけなさい。
fetch_finish()
ミューテックスによって同期的に呼び出されるだけなので、run_processes_parallel,
の周りは必要ありませんsubmodules_with_errors
。
Git 2.28(2020年第3四半期)では、スクリプト化された「gitサブモジュール」Porcelainコマンドの一部の書き換えが続行されることに注意してください。今回は" git submodule set-branch
"サブコマンドの番です。
Shourya Shukla()によるcommit 2964d6e(2020年6月2日)を参照してください。( Junio C Hamanoによってマージされました---コミット1046282、2020年6月25日)periperidip
gitster
submodule
:ポートサブコマンド'set-branch'シェルからCへ
メンター:Christian
Couderメンター:Kaartic Sivaraam
支援:Denton Liu
支援:Eric Sunshine
支援:ĐoànTrầnCôngDanh
署名者:Shourya Shukla
サブモジュールサブコマンド'set-branch'を組み込みに変換し、を介して呼び出しますgit submodule.sh
。