git सबमॉड्यूल को उत्पादन में नहीं धकेला गया

Nov 26 2020

अभी दो सबमॉड्यूल के साथ एक नया भंडार बनाया है। यह स्थानीय पर ठीक काम करता है लेकिन उत्पादन में धकेलने पर सबमॉड्यूल नहीं होता है। प्रत्येक सबमॉड्यूल रूट डायरेक्टरी मौजूद है, लेकिन अंदर कोई फाइल नहीं

git version 2.27.0

उत्पादन पर रेपो बनाएं

git --bare init
cd hooks && touch post-receive && chmod +x post-receive

cat hooks/post-receive
#/bin/sh
git --work-tree=/var/www/repo --git-dir=/var/git_repos/repo.git checkout -f

देव / स्थानीय से उत्पादन के लिए धक्का

git push production master

git statusबताता है कि सब कुछ अप टू डेट है। भले ही इसे सबमॉड्यूल फ़ोल्डर में कहा जाता है। स्थानीय रिपॉजिटरी पर सबमॉड्यूल फ़ोल्डर को हटाने, रिपोजिटरी को कमिट / पुश करने की कोशिश की है। तब git push production masterऔर रूट सबमॉड्यूल फ़ोल्डर को उत्पादन सर्वर पर हटा दिया गया था। फिर उसे फिर से जोड़ने की कोशिश की जा रही है

# git submodule add [email protected]:alias/repo_name.git php/repo/repo_name
Cloning into '/var/www/project/php/repo/repo_name'...
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 19 (delta 8), reused 19 (delta 8), pack-reused 0
Receiving objects: 100% (19/19), 8.62 KiB | 8.62 MiB/s, done.
Resolving deltas: 100% (8/8), done.

फिर रिपॉजिटरी में आना और फिर git push production master। एक ही समस्या। उत्पादन में सबमॉडल्स के रूट फोल्डर मौजूद हैं, लेकिन डायरेक्टरीज़ में कोई फाइल नहीं है।

जब मैं गितुब पर रिपॉजिटरी ब्राउज़ करता हूं, तो सबमॉड्यूल सही तरीके से जुड़े होते हैं।

स्थानीय भंडार में सब कुछ काम करता है

जवाब

VonC Nov 28 2020 at 03:24

सबमॉड्यूल फ़ोल्डर गितुब (या स्थानीय रेपो) में खाली नहीं हैं, लेकिन जब वे उत्पादन के लिए धक्का देते हैं

यह अपेक्षित है: एक सबमॉड्यूल से बना है:

  • में एक URL पंजीकृत है .gitmodules
  • a gitlink, सूचकांक में एक विशेष प्रविष्टि जो सबमॉड्यूल रिपॉजिटरी के मूल वृक्ष के SHA1 का प्रतिनिधित्व करती है।

जब आप सबमोडुल्स के साथ एक रिमोट रिपॉजिटरी को क्लोन करते हैं ( git clone --recurse-submodulesविकल्प का उपयोग करके , उन सबमॉड्यूल रिपॉजिटरी को स्वयं क्लोन किया जाता है, और उस gitlink द्वारा दर्शाए गए SHA1 पर चेक आउट किया जाता है।

"उत्पादन की ओर धकेलना" मुश्किल है क्योंकि आपको चेक आउट (गैर-नंगे) रिपॉजिटरी (यहां तक ​​कि आप तकनीकी रूप से भी कर सकते हैं ) पर जोर नहीं देना चाहिए ।

उत्पादन पर एक नंगे भंडार पर धकेलना बेहतर है, जो फ़ाइलों को पुनर्स्थापित करने के लिए पोस्ट-प्राप्त हुक का उपयोग करेगा (सबमॉड्यूल सामग्री सहित, उपयोग करके git restore --recurse-submodules)


चर्चा के बाद :

  1. उत्पादन सर्वर के लिए आपके खाते में सार्वजनिक SSH कुंजी पंजीकृत होना आवश्यक है, क्योंकि सबमॉड्यूल .gitmodulesएक SSH URL के साथ पंजीकृत हैं ।

  2. उत्तर-प्राप्त स्क्रिप्ट बन जाती है:

    #!/bin/bash
    cd /var/www/repo
    git --git-dir=/var/git_repos/repo.git --work-tree=. restore --recurse-submodules :/
    

के साथ git submodule, आप काम के पेड़ को स्पष्ट रूप से सेट नहीं कर सकते

इसका मतलब है, अगर सबमॉड्यूल्स शामिल हैं, तो आपको वर्तमान फ़ोल्डर काम करने वाला पेड़ होना चाहिए।

फिर आप एक अलग git-dir ( ) के साथ git checkout/ जैसे या के git restoreसाथ कमांड कर सकते हैं ।--recurse-submodulesgit submodule update --init--git-dir=/path/to/bare/repo.git

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

यदि आप कहीं से /var/www/repoभी हैं git --work-tree=/var/www/repo ..., तो भी आप निर्दिष्ट करें , उपरोक्त आदेशों में से कोई भी git checkout/ git restoreसाथ --recurse-submodules, या git submodule update --initआपके रेपो के सबमॉड्यूल्स के लिए काम नहीं करेगा।
वह है: आपकी /var/www/repoफ़ाइलों को पुनर्स्थापित किया जाएगा, लेकिन सबमॉडल्स खाली रहेंगे।