Pertanyaan Cara mudah untuk menarik terbaru dari semua submodules git


Kami menggunakan submodul git untuk mengelola beberapa proyek besar yang memiliki ketergantungan pada banyak pustaka lain yang kami kembangkan. Setiap perpustakaan adalah repo terpisah yang dibawa ke dalam proyek dependen sebagai submodul. Selama pengembangan, kami sering hanya ingin mengambil versi terbaru dari setiap submodul dependen.

Apakah git memiliki perintah bawaan untuk melakukan ini? Jika tidak, bagaimana dengan file batch Windows atau yang serupa yang dapat melakukannya?


1372
2018-06-23 01:05


asal


Jawaban:


Untuk git 1.8.2 atau di atas opsi --remote ditambahkan untuk mendukung pembaruan ke kiat terbaru cabang jarak jauh:

git submodule update --recursive --remote

Ini memiliki manfaat tambahan dengan menghormati cabang "tidak standar" yang ditentukan dalam .gitmodules atau .git/config file (jika Anda memiliki, default adalah asal / master, dalam hal ini beberapa jawaban lain di sini akan berfungsi juga).

Untuk git 1.7.3 atau di atas, Anda dapat menggunakan (tetapi di bawah ini terdapat sekitar pembaruan yang masih berlaku):

git submodule update --recursive

atau:

git pull --recurse-submodules

jika Anda ingin menarik submodul Anda ke komit terbaru intead apa repo menunjuk ke.

Catatan: Jika itu pertama kali Anda memeriksa repo yang perlu Anda gunakan --init pertama:

git submodule update --init --recursive

Untuk lebih tua, git 1.6.1 atau di atas Anda dapat menggunakan sesuatu yang mirip dengan (dimodifikasi sesuai):

git submodule foreach git pull origin master

Lihat git-submodule (1) untuk detailnya


1748
2018-06-23 13:42



Jika Anda perlu menarik barang untuk submodul ke dalam penggunaan repositori submodule Anda

git pull --recurse-submodules

sebuah fitur git pertama kali dipelajari di 1.7.3.

Tapi ini tidak akan memeriksa commit yang tepat (yang diwakili oleh master repositori Anda) dalam submodul

Untuk checkout komit yang tepat dalam submodules Anda, Anda harus memperbaruinya setelah menarik menggunakan

git submodule update --recursive --remote

567
2017-11-10 18:07



Catatan: Ini dari tahun 2009 dan mungkin sudah bagus, tetapi ada opsi yang lebih baik sekarang.

Kami menggunakan ini. Ini disebut git-pup:

#!/bin/bash
# Exists to fully update the git repo that you are sitting in...

git pull && git submodule init && git submodule update && git submodule status

Taruh saja di direktori bin yang sesuai (/ usr / local / bin). Jika di Windows, Anda mungkin perlu memodifikasi sintaks agar berfungsi :)

Memperbarui:

Sebagai tanggapan atas komentar oleh penulis asli tentang menarik semua KEPALA semua submodul - itu adalah pertanyaan yang bagus.

Saya sangat yakin itu git tidak memiliki perintah untuk ini secara internal. Untuk melakukannya, Anda perlu mengidentifikasi apa sebenarnya HEAD untuk submodul. Itu bisa sesederhana mengatakan master adalah cabang paling baru, dll ...

Setelah ini, buat skrip sederhana yang melakukan hal berikut:

  1. memeriksa git submodule status untuk repositori "dimodifikasi". Karakter pertama dari garis output menunjukkan ini. Jika sub-repo dimodifikasi, Anda mungkin TIDAK ingin melanjutkan.
  2. untuk setiap repo yang terdaftar, masukkan ke direktori itu dan jalankan git checkout master && git pull. Periksa kesalahan.
  3. Pada akhirnya, saya sarankan Anda mencetak tampilan kepada pengguna untuk menunjukkan status saat ini dari submodules - mungkin meminta mereka untuk menambahkan semua dan berkomitmen?

Saya ingin menyebutkan bahwa gaya ini tidak benar-benar apa yang dirancang untuk submodul git. Biasanya, Anda ingin mengatakan "LibraryX" pada versi "2.32" dan akan tetap seperti itu sampai saya memberitahukannya untuk "meningkatkan".

Artinya, dalam arti, apa yang Anda lakukan dengan skrip yang dideskripsikan, tetapi hanya lebih otomatis. Perlu perawatan!

Perbarui 2:

Jika Anda berada di platform windows, Anda mungkin ingin menggunakan Python untuk menerapkan skrip karena sangat mampu dalam bidang ini. Jika Anda menggunakan unix / linux, maka saya sarankan hanya skrip bash.

Perlu klarifikasi apa pun? Cukup kirimkan komentar.


295
2018-06-23 01:50



Pada init menjalankan perintah berikut:

git submodule update --init --recursive

dari dalam direktori git repo, berfungsi paling baik untuk saya.

Ini akan menarik semua submodul termasuk terbaru.

Dijelaskan

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            --init without the explicit init step if you do not intend to customize
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

Setelah ini, Anda cukup menjalankan:

git submodule update --recursive

dari dalam direktori git repo, berfungsi paling baik untuk saya.

Ini akan menarik semua submodul termasuk terbaru.

Dijelaskan

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

289
2017-12-11 19:38



Henrik ada di jalur yang benar. Perintah 'foreach' dapat mengeksekusi skrip shell sembarang. Dua opsi untuk menarik yang terbaru mungkin,

git submodule foreach git pull origin master

dan,

git submodule foreach /path/to/some/cool/script.sh

Itu akan mengulangi semuanya diinisialisasi submodul dan jalankan perintah yang diberikan.


151
2018-06-23 14:21



Berikut ini bekerja untuk saya di Windows.

git submodule init
git submodule update

138
2017-07-22 13:12



Edit:

Dalam komentar itu ditunjukkan (oleh philfreo ) bahwa versi terbaru diperlukan. Jika ada submodules bersarang yang perlu dalam versi terbaru mereka:

git submodule foreach --recursive git pull

----- Komentar lama di bawah ini -----

Bukankah ini cara resmi untuk melakukannya?

git submodule update --init

Saya menggunakannya setiap saat. Belum ada masalah sejauh ini.

Edit:

Saya baru saja menemukan bahwa Anda dapat menggunakan:

git submodule foreach --recursive git submodule update --init 

Yang juga akan secara rekursif menarik semua submodul, yaitu ketergantungan.


33
2018-04-05 16:23