git - सभी गिट submodules के नवीनतम खींचने के लिए आसान तरीका




git-submodules (11)

हम कुछ बड़ी परियोजनाओं को प्रबंधित करने के लिए गिट सबमिड्यूल का उपयोग कर रहे हैं जिनके पास हमने विकसित कई अन्य पुस्तकालयों पर निर्भरताएं हैं। प्रत्येक लाइब्रेरी एक अलग रेपो है जो निर्भर परियोजना में एक सबमिशन के रूप में लाया जाता है। विकास के दौरान, हम अक्सर हर आश्रित सबमिशन के नवीनतम संस्करण को पकड़ना चाहते हैं।

क्या गिट के पास ऐसा करने के लिए कमांड बनाया गया है? यदि नहीं, तो विंडोज बैच फ़ाइल या इसी तरह के बारे में यह कैसे कर सकता है?


निम्नलिखित कमांड चलाने में init पर:

git submodule update --init --recursive

गिट रेपो निर्देशिका के भीतर से, मेरे लिए सबसे अच्छा काम करता है।

यह सब नवीनतम सहित submodules खींच जाएगा।

व्याख्या की

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

गिट रेपो निर्देशिका के भीतर से, मेरे लिए सबसे अच्छा काम करता है।

यह सब नवीनतम सहित submodules खींच जाएगा।

व्याख्या की

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.

पहली बार

क्लोन और इनिट सबमॉड्यूल

git clone [email protected]:speedovation/kiwi-resources.git resources
git submodule init

आराम

विकास के दौरान बस सबमिशन खींचें और अपडेट करें

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

उत्पत्ति पर नवीनतम प्रतिबद्धता के लिए गिट सबमिशन अपडेट करें

git submodule foreach git pull origin master

पसंदीदा तरीका नीचे होना चाहिए

git submodule update --remote --merge

नोट: पिछले दो आदेशों का एक ही व्यवहार है


टिप्पणी: बहुत आसान तरीका नहीं, लेकिन व्यावहारिक और इसके अपने अद्वितीय पेशेवर हैं।

यदि कोई एक भंडार के केवल HEAD संशोधन को क्लोन करना चाहता है और केवल इसके सभी submodules (यानी चेकआउट "ट्रंक") के HEAD एस है, तो कोई निम्नलिखित लुआ स्क्रिप्ट का उपयोग कर सकता है। कभी-कभी सरल कमांड git submodule update --init --recursive --remote --no-fetch --depth=1 परिणामस्वरूप एक अप्राप्य git त्रुटि हो सकता है। इस मामले में git clone --separate-git-dir कमांड का उपयोग कर मैन्युअल रूप से git clone --separate-git-dir .git/modules निर्देशिका और क्लोन सबमिशन की उपनिर्देशिका को साफ करने की आवश्यकता है। एकमात्र जटिलता यूआरएल , .git की .git निर्देशिका का पथ और सुपरप्रोजेक्ट पेड़ में सबमिशन के पथ का पता लगाना है।

टिप्पणी: स्क्रिप्ट केवल https://github.com/boostorg/boost.git भंडार के खिलाफ परीक्षण की जाती है। इसकी विशिष्टताओं: एक ही होस्ट पर होस्ट किए गए सभी submodules और .gitmodules में केवल सापेक्ष यूआरएल है

-- 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

मुझे नहीं पता कि यह किस गिट का संस्करण काम कर रहा है, लेकिन यही वह है जिसे आप खोज रहे हैं:

git submodule update --recursive

मैं इसे रूट रिपोजिटरी को अपडेट करने के लिए git pull साथ भी उपयोग करता हूं:

git pull && git submodule update --recursive

यदि आपको अपने सबमिशन रिपॉजिटरीज़ में सबमिड्यूल के लिए सामान खींचने की आवश्यकता है

git pull --recurse-submodules

एक फीचर गिट पहली बार 1.7.3 में सीखा।

लेकिन यह submodules में उचित काम (जो आपके मास्टर भंडार बिंदुओं) को चेकआउट नहीं करेगा

अपने submodules में उचित काम करने के लिए आपको उपयोग करने के बाद उन्हें अद्यतन करना चाहिए

git submodule update --recursive --remote

यहां आपके सभी गिट रिपॉजिटरीज़ से खींचने के लिए कमांड लाइन है चाहे वे submodules हैं या नहीं:

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

यदि आप इसे अपने शीर्ष गिट भंडार में चला रहे हैं, तो आप "$ROOT" को प्रतिस्थापित कर सकते हैं .


विंडोज़ पर मेरे लिए निम्नलिखित काम किया।

git submodule init
git submodule update

हेनरिक सही रास्ते पर है। 'Foreach' कमांड किसी भी मनमाने ढंग से खोल स्क्रिप्ट निष्पादित कर सकते हैं। बहुत ताजा खींचने के लिए दो विकल्प हो सकते हैं,

git submodule foreach git pull origin master

तथा,

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

यह सभी प्रारंभिक submodules के माध्यम से फिर से शुरू होगा और दिए गए आदेश चलाएगा।


मैंने के उत्तर को ऊपर ऐसा किया:

इसे एक गिट [alias] साथ एकीकृत करें ...

यदि आपके मूल प्रोजेक्ट में इस तरह कुछ है .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

अपने .gitconfig के अंदर ऐसा कुछ जोड़ें

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

फिर अपने submodules को अद्यतन करने के लिए, चलाएं:

git updatesubs

मेरे पर्यावरण सेटअप रेपो में इसका एक example है।


गिट 1.8.2 या विकल्प के ऊपर - रिमोट शाखाओं की नवीनतम युक्तियों को अपडेट करने में सहायता के लिए रिमोट जोड़ा गया था:

git submodule update --recursive --remote

इसमें .gitmodules या .gitmodules .git/config फ़ाइलों में निर्दिष्ट किसी भी "गैर-डिफ़ॉल्ट" शाखाओं का सम्मान करने का अतिरिक्त लाभ है (यदि आपके पास कोई है, तो मूल मूल / मास्टर है, इस मामले में यहां कुछ अन्य उत्तर यहां काम करेंगे कुंआ)।

गिट 1.7.3 या इससे ऊपर के लिए आप उपयोग कर सकते हैं (लेकिन नीचे जो भी अपडेट अभी भी लागू होता है):

git submodule update --recursive

या:

git pull --recurse-submodules

यदि आप अपने सबोडोड्यूल को रीपो पॉइंट्स के पूर्णांक के अंतराल में खींचना चाहते हैं।

नोट: यदि पहली बार आप एक रेपो चेकआउट करते हैं तो आपको पहले उपयोग --init :

git submodule update --init --recursive

पुराने के लिए, 1.6.1 या उससे ऊपर गिट आप कुछ समान (सूट में संशोधित) का उपयोग कर सकते हैं:

git submodule foreach git pull origin master

विवरण के लिए git-submodule(1) देखें


संपादित करें :

टिप्पणियों में इंगित किया गया था ( philfreo द्वारा) कि नवीनतम संस्करण की आवश्यकता है। यदि कोई नेस्टेड सबोड्यूल्यूल है जो अपने नवीनतम संस्करण में होना आवश्यक है:

git submodule foreach --recursive git pull

----- नीचे पुरानी टिप्पणी -----

क्या यह ऐसा करने का आधिकारिक तरीका नहीं है?

git submodule update --init

मैं हर बार इसका इस्तेमाल करता हूं। अभी तक कोई समस्या नहीं है।

संपादित करें:

मैंने अभी पाया है कि आप इसका उपयोग कर सकते हैं:

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

जो सभी submodules, यानी निर्भरता को भी दोबारा खींच देगा।





git-submodules