git submodule tracking terbaru

141

Kami sedang memindahkan proyek (besar) kami ke git dan kami berpikir untuk menggunakan submodul. Rencana kami adalah memiliki tiga kepala berbeda dalam superproject: rilis, stabil, terbaru. Pimpinan proyek akan menangani rilis dan cabang stabil. Mereka akan memindahkan submodul sesuai kebutuhan.

Masalahnya adalah kepala "terbaru". Kami ingin kepala superproject "terbaru" melacak cabang master dari semua submodul (secara otomatis). Dan juga akan sangat bagus jika itu akan menunjukkan sejarah semua komitmen ke submodule.

Saya telah melihat gitslave, tetapi bukan itu yang kami inginkan. Ada saran?

l.thee.a
sumber
Saat Anda meminta alat, saya hanya ingin menghubungkan pertanyaan ini yang mengumpulkan satu baris dengan melakukan hal yang sama: stackoverflow.com/questions/1030169/…
Tobu
Git sekarang menawarkan pelacakan terbaru dengan submodul: lihat jawaban saya yang telah diedit.
VonC

Jawaban:

240

Perbarui Maret 2013

Git 1.8.2 menambahkan kemungkinan untuk melacak cabang.

" git submodule" mulai mempelajari mode baru untuk diintegrasikan dengan ujung cabang jarak jauh (sebagai kebalikan dari mengintegrasikan dengan komit yang direkam dalam gitlink superproject).

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 

Jika Anda memiliki submodul yang sudah ada, sekarang Anda ingin melacak cabang, lihat " cara membuat jalur submodul yang ada menjadi cabang ".

Juga lihat tutorial Vogella tentang submodul untuk informasi umum tentang submodul.

catatan:

git submodule add -b . [URL to Git repo];
                    ^^^

Lihat git submodulehalaman manual :

Nilai khusus dari .digunakan untuk menunjukkan bahwa nama cabang di submodule harus sama dengan nama cabang saat ini di repositori saat ini .


Lihat commit b928922727d6691a3bdc28160f93f25712c565f6 :

submodule add: Jika --branchdiberikan, catat dalam.gitmodules

Ini memungkinkan Anda untuk dengan mudah merekam submodule.<name>.branchopsi .gitmodulessaat Anda menambahkan submodul baru. Dengan tambalan ini,

$ git submodule add -b <branch> <repository> [<path>]
$ git config -f .gitmodules submodule.<path>.branch <branch>

dikurangi menjadi

$ git submodule add -b <branch> <repository> [<path>]

Ini berarti panggilan ke masa depan

$ git submodule update --remote ...

akan mendapatkan pembaruan dari cabang yang sama yang Anda gunakan untuk menginisialisasi submodul, yang biasanya sesuai dengan keinginan Anda.

Ditandatangani oleh: W. Trevor King


Jawaban asli (Februari 2012):

Submodul adalah komit tunggal yang direferensikan oleh repo induk.
Karena ini adalah repo Git sendiri, "riwayat semua komitmen" dapat diakses melalui git logdalam submodul itu.

Jadi agar induk dapat melacak secara otomatis komit terbaru dari cabang submodul tertentu, itu perlu:

  • cd di submodule
  • git fetch / pull untuk memastikannya memiliki komit terbaru di cabang kanan
  • cd kembali ke repo induk
  • tambahkan dan komit untuk merekam komit baru dari submodul.

gitslave (yang sudah Anda lihat) tampaknya paling cocok, termasuk untuk operasi komit .

Agak menjengkelkan untuk membuat perubahan pada submodule karena persyaratan untuk memeriksa ke cabang submodule yang benar, membuat perubahan, komit, dan kemudian masuk ke superproject dan komit (atau setidaknya rekam lokasi baru dari submodul).

Alternatif lain dirinci di sini .

VonC
sumber
2
@BraveNewMath Anda harus checkout cabang tepat di submodule Anda, kemudian pergi ke repo orang tua Anda dan ketik: git config -f .gitmodules submodule.<path>.branch <branch>. Tambahkan semuanya, komit dan dorong.
VonC
2
@BraveNewMath Saya merinci semua langkah untuk membuat track submodule cabang di stackoverflow.com/a/18799234/6309 .
VonC
1
Penting untuk menggunakan --remotetag jika Anda tidak ingin kepala lepas saat Anda memperbarui, bertanya-tanya mengapa sepertinya kode yang baru Anda tarik berada di belakang master!
Chris Watts
3
@ DC_ Saya setuju dengan "jawaban ini" (sejak saya menulisnya). Fitur "mengikuti cabang" dimaksudkan untuk memperbarui submodul ke komit cabang yang terbaru. Setelah selesai, Anda masih harus menambahkan dan melakukan status submodul baru di repo induk. Dan klon berikutnya akan memeriksa status itu (tanpa kepala).
VonC
3
@VonC Jadi untuk memperjelas lebih lanjut, fitur "mengikuti cabang" hanya mempengaruhi perilaku git submodule updateperintah dengan memberi tahu mana yang melakukan (yaitu komit terbaru pada master) untuk memperbarui submodul ke, tidak secara otomatis menyebabkan repo induk memperbarui yang mana komit ditunjukkan oleh submodul pada saat klon?
christner