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?
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
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
git submodule update --init --recursive
dari dalam repo git direktori, karya-karya yang terbaik untuk saya.
Ini akan menarik semua terbaru termasuk submodul.
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.
git submodule update --recursive
dari dalam repo git direktori, karya-karya yang terbaik untuk saya.
Ini akan menarik semua terbaru termasuk submodul.
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:
git submodule status
untuk "diubah" repositori. Karakter pertama dari baris output menunjukkan hal ini. Jika sub-repo dimodifikasi, anda mungkin TIDAK ingin untuk melanjutkan.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.
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.
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'
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.
Clone dan Init Submodule
git clone [email protected]:speedovation/kiwi-resources.git resources
git submodule init
Pembangunan selama ini hanya menarik dan update submodule
git pull --recurse-submodules && git submodule update --recursive
git submodule foreach git pull origin master
git submodule update --remote --merge
catatan: ada dua perintah yang memiliki perilaku yang sama
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
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
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
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 = [email protected]:altercation/solarized.git
[submodule "opt/submodules/intellij-colors-solarized"]
path = opt/submodules/intellij-colors-solarized
url = [email protected]: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.
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 .
.
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.
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 sederhana
git submodule update --init --recursive-remote-tidak-fetch-depth=1dapat mengakibatkan dipulihkan
gitkesalahan. 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