(Git 2.22, Q2 2019, telah diperkenalkan git submodule set-branch --branch aBranch -- <submodule_path>
)
Perhatikan bahwa jika Anda memiliki yang ada submodule yang tidak melacak cabang belum , maka ( jika Anda memiliki 1.8.2+ git ):
Pastikan repo induk tahu bahwa submodule-nya sekarang melacak cabang:
cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>
Pastikan submodule Anda paling lambat dari cabang itu:
cd path/to/your/submodule
git checkout -b branch --track origin/branch
# if the master branch already exist:
git branch -u origin/master master
(dengan 'asal' menjadi nama repo jarak jauh hulu , submodule telah dikloning.
Bagian git remote -v
dalam submodule akan menampilkannya. Biasanya, itu 'asal')
Jangan lupa untuk mencatat status submodule baru Anda di repo orang tua Anda:
cd /path/to/your/parent/repo
git add path/to/your/submodule
git commit -m "Make submodule tracking a branch"
Pembaruan berikutnya untuk submodule itu harus menggunakan --remote
opsi:
# 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
Perhatikan bahwa dengan Git 2.10+ (Q3 2016), Anda dapat menggunakan ' .
' sebagai nama cabang:
Nama cabang dicatat seperti submodule.<name>.branch
dalam .gitmodules
untuk update --remote
.
Nilai khusus .
digunakan untuk menunjukkan bahwa nama cabang dalam submodule harus nama yang sama dengan cabang saat ini di repositori saat ini .
Tapi, seperti dikomentari oleh LubosD
Dengan git checkout
, jika nama cabang yang diikuti adalah " .
", itu akan mematikan pekerjaan Anda yang tidak berkomitmen!
Gunakan git switch
sebagai gantinya.
Itu berarti Git 2.23 (Agustus 2019) atau lebih.
Lihat " Bingung olehgit checkout
"
Jika Anda ingin memperbarui semua submodul Anda mengikuti cabang:
git submodule update --recursive --remote
Perhatikan bahwa hasilnya, untuk setiap submodule yang diperbarui, akan hampir selalu menjadi HEAD terpisah , seperti yang dicatat Dan Cameron dalam jawabannya .
( Clintm mencatat dalam komentar bahwa, jika Anda menjalankan git submodule update --remote
dan sha1 yang dihasilkan sama dengan cabang saat submodule aktif, ia tidak akan melakukan apa pun dan membiarkan submodule tetap "pada cabang itu" dan tidak dalam keadaan kepala terpisah. )
Untuk memastikan cabang benar-benar diperiksa (dan itu tidak akan mengubah SHA1 dari entri khusus yang mewakili submodule untuk repo induk), ia menyarankan:
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch $branch'
Setiap submodule masih akan mereferensikan SHA1 yang sama, tetapi jika Anda membuat komitmen baru, Anda akan bisa mendorongnya karena dirujuk oleh cabang yang Anda ingin submodule dilacak.
Setelah dorongan dalam submodule, jangan lupa untuk kembali ke induk repo, tambahkan, komit dan tekan SHA1 baru untuk submodul yang dimodifikasi.
Perhatikan penggunaan $toplevel
, direkomendasikan dalam komentar oleh Alexander Pogrebnyak .
$toplevel
diperkenalkan di git1.7.2 pada Mei 2010: commit f030c96 .
ini berisi jalur absolut dari direktori tingkat atas (di mana .gitmodules
).
dtmland
menambahkan komentar :
Skrip foreach akan gagal untuk checkout submodules yang tidak mengikuti cabang.
Namun, perintah ini memberi Anda berdua:
git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git switch $branch' –
Perintah yang sama tetapi lebih mudah dibaca:
git submodule foreach -q --recursive \
'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
[ "$branch" = "" ] && \
git checkout master || git switch $branch' –
umläute memurnikan perintah dtmland dengan versi yang disederhanakan dalam komentar :
git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
beberapa baris:
git submodule foreach -q --recursive \
'git switch \
$(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
Sebelum Git 2.26 (Q1 2020), pengambilan yang diperintahkan untuk secara rekursif mengambil pembaruan dalam submodul pasti menghasilkan rim output, dan itu menjadi sulit untuk menemukan pesan kesalahan.
Perintah telah diajarkan untuk menyebutkan submodul yang memiliki kesalahan pada akhir operasi .
Lihat komit 0222540 (16 Jan 2020) oleh Emily Shaffer ( nasamuffin
) .
(Digabung oleh Junio C Hamano - gitster
- dalam commit b5c71cc , 05 Feb 2020)
fetch
: tekankan kegagalan selama pengambilan submodule
Ditandatangani oleh: Emily Shaffer
Dalam kasus ketika pengambilan submodule gagal ketika ada banyak submodul, kesalahan dari pengambilan submodul yang gagal dikuburkan di bawah aktivitas pada submodul lain jika lebih dari satu pengambilan diambil kembali fetch-by-oid
.
Sebut kegagalan terlambat sehingga pengguna sadar bahwa ada masalah, dan di mana .
Karena fetch_finish()
hanya dipanggil secara sinkron dengan run_processes_parallel,
mutex tidak diperlukan di sekitar submodules_with_errors
.