Cara mudah untuk menarik terbaru dari seluruh git submodul

Kami're menggunakan git submodul untuk mengelola beberapa proyek-proyek besar yang memiliki ketergantungan pada banyak perpustakaan lain kita've dikembangkan. Masing-masing perpustakaan yang terpisah repo dibawa ke tergantung proyek sebagai submodule. Selama pengembangan, kita sering ingin hanya pergi ambil versi terbaru dari setiap tergantung submodule.

Apakah git memiliki built-in perintah untuk melakukan hal ini? Jika tidak, bagaimana Windows batch file atau serupa yang dapat melakukannya?

Mengomentari pertanyaan (2)
Larutan

Jika itu's pertama kali anda checkout repo yang anda butuhkan untuk menggunakan --init pertama:

git submodule update --init --recursive

Untuk git 1.8.2 atau di atas opsi --remote ditambahkan untuk mendukung update ke tips terbaru dari remote cabang:

git submodule update --recursive --remote

Ini memiliki manfaat tambahan untuk menghormati setiap "non-default" cabang-cabang yang ditentukan dalam .gitmodules atau `.git/config file (jika anda kebetulan memiliki, default adalah asal/induk, dalam hal ini beberapa jawaban yang lain di sini akan bekerja dengan baik).

Untuk git 1.7.3 atau di atas, anda dapat menggunakan (tapi di bawah gotchas sekitar apa update apakah masih berlaku):

git submodule update --recursive

atau:

git pull --recurse-submodules

jika anda ingin menarik anda submodul untuk terbaru melakukan intead apa repo poin.

Lihat git-submodule(1) untuk rincian

Komentar (20)
git pull --recurse-submodules --jobs=10

fitur git pertama kali belajar di 1.8.5.

Untuk pertama kalinya, anda perlu untuk menjalankan

git submodule update --init --recursive

Komentar (8)

Di init menjalankan perintah berikut:

git submodule update --init --recursive

dari dalam repo git direktori, karya-karya yang terbaik untuk saya.

Ini akan menarik semua terbaru termasuk submodul.

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..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 hanya dapat menjalankan:

git submodule update --recursive

dari dalam repo git direktori, karya-karya yang terbaik untuk saya.

Ini akan menarik semua terbaru termasuk submodul.

Komentar (8)

Catatan: Ini adalah dari tahun 2009 dan mungkin telah baik, tetapi ada pilihan yang lebih baik sekarang.

Kami menggunakan ini. It's 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

Hanya menaruhnya di direktori bin (/usr/local/bin). Jika pada Windows, anda mungkin perlu untuk memodifikasi sintaks untuk mendapatkan itu untuk bekerja :)

Update:

Dalam menanggapi komentar oleh penulis asli tentang menarik di Kepala semua submodul -- itu adalah pertanyaan yang bagus.

Saya cukup yakin bahwa git tidak memiliki perintah ini secara internal. Dalam rangka untuk melakukannya, anda akan perlu untuk mengidentifikasi apa yang KEPALA benar-benar adalah untuk submodule. Yang dapat yang sederhana seperti mengatakan master adalah yang paling up to date cabang, dll...

Berikut ini, membuat script sederhana yang berikut ini:

  1. periksa git submodule status untuk "diubah" repositori. Karakter pertama dari baris output menunjukkan hal ini. Jika sub-repo dimodifikasi, anda mungkin TIDAK ingin untuk melanjutkan.
  2. untuk setiap repo terdaftar, cd ke it's direktori dan menjalankan git checkout master && git pull`. Memeriksa kesalahan.
  3. Pada akhirnya, saya sarankan anda mencetak tampilan kepada pengguna untuk menunjukkan status dari submodul-mungkin meminta mereka untuk menambahkan semua dan komit?

I'd ingin menyebutkan bahwa gaya ini tidak benar-benar apa git submodul yang dirancang untuk. Biasanya, anda ingin mengatakan "LibraryX" di versi "2.32" dan akan tetap seperti itu sampai saya kirim ke "meng-upgrade".

Artinya, dalam arti, apa yang anda lakukan dengan yang dijelaskan naskah, tetapi hanya lebih secara otomatis. Perawatan diperlukan!

Update 2:

Jika anda berada di platform windows, anda mungkin ingin melihat menggunakan Python untuk mengimplementasikan script seperti ini sangat mampu di daerah ini. Jika anda berada di unix/linux, maka saya sarankan hanya bash script.

Perlu klarifikasi? Hanya posting komentar.

Komentar (6)

Henrik berada di jalur yang benar. The 'foreach' perintah dapat mengeksekusi setiap sewenang-wenang shell script. Dua pilihan untuk menarik terbaru yang sangat mungkin,

git submodule foreach git pull origin master

dan,

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

Yang akan iterate melalui semua diinisialisasi submodul dan menjalankan perintah yang diberikan.

Komentar (0)

Berikut ini bekerja untuk saya pada Windows.

git submodule init
git submodule update
Komentar (3)

Karena mungkin terjadi bahwa cabang default anda adalah submodul tidak master, ini adalah bagaimana saya mengotomatisasi penuh Git submodul upgrade:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'
Komentar (1)

Edit:

Di komentar itu menunjukkan (dengan philfreo ) bahwa versi terbaru diperlukan. Jika ada bersarang submodul yang perlu di versi terbaru mereka :

git submodule foreach --recursive git pull

-----Usang komentar di bawah ini-----

Isn't ini resmi cara untuk melakukannya ?

git submodule update --init

Saya menggunakannya setiap waktu. Tidak ada masalah sejauh ini.

Edit:

Saya hanya menemukan bahwa anda dapat menggunakan:

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

Yang juga akan rekursif menarik semua submodul, yaitu dependancies.

Komentar (3)

Pertama kali waktu

Clone dan Init Submodule

git clone git@github.com:speedovation/kiwi-resources.git resources
git submodule init

Istirahat

Pembangunan selama ini hanya menarik dan update submodule

git pull --recurse-submodules  && git submodule update --recursive

Update Git submodule terbaru komit pada asal

git submodule foreach git pull origin master

Cara yang lebih disukai harus di bawah ini

git submodule update --remote --merge

catatan: ada dua perintah yang memiliki perilaku yang sama

Komentar (2)

Saya don't tahu sejak versi git ini bekerja, tapi yang's apa yang anda'kembali mencari:

git submodule update --recursive

Saya menggunakannya dengan git pull untuk memperbarui root repositori, terlalu:

git pull && git submodule update --recursive
Komentar (0)

Atas jawaban yang baik, namun kami menggunakan git-kait untuk membuat ini lebih mudah tapi ternyata yang di git 2.14, anda dapat mengatur git config submodule.recurse ke true untuk mengaktifkan submodul untuk diperbarui ketika anda menarik untuk anda repositori git.

Ini akan memiliki efek samping mendorong semua submodul perubahan yang anda miliki jika mereka berada di cabang-cabang, namun tetapi jika anda memiliki kebutuhan bahwa perilaku ini sudah bisa melakukan pekerjaan.

Dapat dilakukan dengan menggunakan:

git config submodule.recurse true
Komentar (0)

Melihat http://lists.zerezo.com/git/msg674976.html yang memperkenalkan --melacak parameter

Komentar (2)

Git untuk windows 2.6.3:

git submodule update-rebase --remote

Komentar (1)

Dari tingkat atas di repo:

git submodule foreach git checkout develop
git submodule foreach git pull

Ini akan beralih semua cabang untuk mengembangkan dan menarik terbaru

Komentar (3)

Saya melakukan ini dengan beradaptasi gahooa's jawaban atas:

Mengintegrasikan dengan git [alias] ...

Jika anda proyek induk memiliki sesuatu seperti ini dalam .gitmodules:

[submodule "opt/submodules/solarized"]
    path = opt/submodules/solarized
    url = git@github.com:altercation/solarized.git
[submodule "opt/submodules/intellij-colors-solarized"]
    path = opt/submodules/intellij-colors-solarized
    url = git@github.com:jkaving/intellij-colors-solarized.git

Menambahkan sesuatu seperti ini dalam diri anda .gitconfig

[alias]
    updatesubs = "!sh -c \"git submodule init && git submodule update && git submodule status\" "

Kemudian untuk memperbarui anda submodul, jalankan:

git updatesubs

Saya memiliki sebuah contoh itu saya penyiapan lingkungan repo.

Komentar (0)

Berikut ini adalah command-line untuk menarik dari semua repositori git anda apakah mereka're atau tidak submodul:

ROOT=$(git rev-parse --show-toplevel 2> /dev/null)
find "$ROOT" -name .git -type d -execdir git pull -v ';'

Jika anda berjalan di atas repositori git, anda dapat mengganti "$AKAR" menjadi ..

Komentar (0)

Semua yang perlu anda lakukan sekarang adalah sederhana git checkout

Hanya pastikan untuk mengaktifkan melalui global config: git config --global submodule.recurse benar

Komentar (0)

Saya pikir anda'll harus menulis script untuk melakukan hal ini. Jujur, aku mungkin menginstal python untuk melakukannya sehingga anda dapat menggunakan os.jalan-jalan untuk cd ke direktori masing-masing dan mengeluarkan perintah yang sesuai. Menggunakan python atau beberapa bahasa scripting, lain dari batch, akan memungkinkan anda untuk dengan mudah menambahkan/menghapus sub-proyek dengan keluar harus memodifikasi script.

Komentar (0)

Catatan: tidak terlalu mudah, tapi bisa diterapkan dan tidak lebih baik.

Jika salah satu ingin mengkloning hanya KEPALA revisi repositori dan hanya KEPALA dari semua submodul (yaitu untuk checkout "batang"), maka salah satu dapat menggunakan berikut *Lua* script. Kadang-kadang perintah sederhanagit submodule update --init --recursive-remote-tidak-fetch-depth=1dapat mengakibatkan dipulihkangitkesalahan. Dalam hal ini perlu untuk membersihkan subdirektori.git/moduldirektori dan clone submodule secara manual menggunakan git clone-terpisah-git-dir perintah. Satu-satunya kompleksitas adalah untuk mengetahui URL, jalan .git direktori submodule dan jalan submodule di superproject pohon.

Catatan: script ini hanya diuji melawan https://github.com/boostorg/boost.git repositori. Kekhasan: semua submodul di-host pada host yang sama dan .gitmodules hanya berisi relatif URLs.

-- mkdir boost ; cd boost ; lua ../git-submodules-clone-HEAD.lua https://github.com/boostorg/boost.git .
local module_url = arg[1] or 'https://github.com/boostorg/boost.git'
local module = arg[2] or module_url:match('.+/([_%d%a]+)%.git')
local branch = arg[3] or 'master'
function execute(command)
    print('# ' .. command)
    return os.execute(command)
end
-- execute('rm -rf ' .. module)
if not execute('git clone --single-branch --branch master --depth=1 ' .. module_url .. ' ' .. module) then
    io.stderr:write('can\'t clone repository from ' .. module_url .. ' to ' .. module .. '\n')
    return 1
end
-- cd $module ; git submodule update --init --recursive --remote --no-fetch --depth=1
execute('mkdir -p ' .. module .. '/.git/modules')
assert(io.input(module .. '/.gitmodules'))
local lines = {}
for line in io.lines() do
    table.insert(lines, line)
end
local submodule
local path
local submodule_url
for _, line in ipairs(lines) do
    local submodule_ = line:match('^%[submodule %"([_%d%a]-)%"%]$')
    if submodule_ then
        submodule = submodule_
        path = nil
        submodule_url = nil
    else
        local path_ = line:match('^%s*path = (.+)$')
        if path_ then
            path = path_
        else
            submodule_url = line:match('^%s*url = (.+)$')
        end
        if submodule and path and submodule_url then
            -- execute('rm -rf ' .. path)
            local git_dir = module .. '/.git/modules/' .. path:match('^.-/(.+)$')
            -- execute('rm -rf ' .. git_dir)
            execute('mkdir -p $(dirname "' .. git_dir .. '")')
            if not execute('git clone --depth=1 --single-branch --branch=' .. branch .. ' --separate-git-dir ' .. git_dir .. ' ' .. module_url .. '/' .. submodule_url .. ' ' .. module .. '/' .. path) then
                io.stderr:write('can\'t clone submodule ' .. submodule .. '\n')
                return 1
            end
            path = nil
            submodule_url = nil
        end
    end
end
Komentar (0)