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




git-submodules (6)

@ जेसन एक तरह से सही है लेकिन पूरी तरह से नहीं।

अद्यतन करें

पंजीकृत submodules, यानी क्लोन गायब submodules अद्यतन करें और युक्त भंडार की अनुक्रमणिका में निर्दिष्ट प्रतिबद्धता चेकआउट। यह submodules HEAD को तब तक अलग कर देगा जब तक --rebase या --merge निर्दिष्ट नहीं है या कुंजी सबमिशन। $ Name.update को रीबेस या विलय करने के लिए सेट किया गया है।

तो, गिट सबमिशन अपडेट चेकआउट करता है, लेकिन बात यह है कि यह युक्त भंडार की अनुक्रमणिका में प्रतिबद्धता है। यह अभी तक नई प्रतिबद्धता अपस्ट्रीम के बारे में अभी तक नहीं जानता है। तो अपने सबमिशन पर जाएं, अपनी इच्छित प्रतिबद्धता प्राप्त करें और मुख्य रिपो में अद्यतन सबमिशन स्थिति को प्रतिबद्ध करें और फिर git submodule update

मेरे पास एक गिट सबमिशन के साथ एक परियोजना है। यह एक एसएसएच से है: // ... यूआरएल, और प्रतिबद्ध ए पर है। कमिट बी को उस यूआरएल पर धक्का दिया गया है, और मैं सबमिशन को प्रतिबद्धता प्राप्त करने के लिए चाहता हूं, और इसमें बदल सकता हूं।

अब, मेरी समझ यह है कि git submodule update यह करना चाहिए, लेकिन ऐसा नहीं है। यह कुछ भी नहीं करता (कोई आउटपुट, सफलता निकास कोड)। यहां एक उदाहरण दिया गया है:

$ mkdir foo
$ cd foo
$ git init .
Initialized empty Git repository in /.../foo/.git/
$ git submodule add ssh://[email protected]/git/mod mod
Cloning into mod...
[email protected]'s password: hunter2
remote: Counting objects: 131, done.
remote: Compressing objects: 100% (115/115), done.
remote: Total 131 (delta 54), reused 0 (delta 0)
Receiving objects: 100% (131/131), 16.16 KiB, done.
Resolving deltas: 100% (54/54), done.
$ git commit -m "Hello world."
[master (root-commit) 565b235] Hello world.
 2 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 .gitmodules
 create mode 160000 mod
# At this point, ssh://[email protected]/git/mod changes; submodule needs to change too.
$ git submodule init
Submodule 'mod' (ssh://[email protected]/git/mod) registered for path 'mod'
$ git submodule update
$ git submodule sync
Synchronizing submodule url for 'mod'
$ git submodule update
$ man git-submodule 
$ git submodule update --rebase
$ git submodule update
$ echo $?
0
$ git status
# On branch master
nothing to commit (working directory clean)
$ git submodule update mod
$ ...

मैंने git fetch mod भी प्रयास किया है, जो एक fetch करने के लिए प्रतीत होता है (लेकिन संभवतः नहीं, क्योंकि यह पासवर्ड के लिए संकेत नहीं दे रहा है!), लेकिन git log और git show नए कामों के अस्तित्व से इंकार कर देता है। अब तक मैं मॉड्यूल को rm कर रहा हूं और इसे दोबारा जोड़ रहा हूं, लेकिन यह सिद्धांत में सिद्धांत और व्यवहार में दोनों गलत है।


आपका मुख्य प्रोजेक्ट एक विशेष प्रतिबद्धता को इंगित करता है कि सबमिशन होना चाहिए। git submodule update क्या करता है चेकआउट करने का प्रयास करना है जो प्रारंभ किए गए प्रत्येक सबमिशन में प्रतिबद्ध है। सबमिशन वास्तव में एक स्वतंत्र भंडार है - बस सबमिशन में एक नई प्रतिबद्धता पैदा करना और धक्का देना पर्याप्त नहीं है, आपको मुख्य परियोजना में सबमिशन के नए संस्करण को स्पष्ट रूप से जोड़ने की भी आवश्यकता है।

तो, आपके मामले में, आपको सबमिशन में सही प्रतिबद्धता मिलनी चाहिए - आइए मान लीजिए कि यह मास्टर की नोक है:

cd mod
git checkout master
git pull origin master

अब मुख्य परियोजना पर वापस जाएं, सबमिशन चरण दें और प्रतिबद्ध करें:

cd ..
git add mod
git commit -m "Updating the submodule 'mod' to the latest version"

अब मुख्य परियोजना के अपने नए संस्करण को धक्का दें:

git push origin master

इस बिंदु से, यदि कोई अन्य अपनी मुख्य परियोजना को अपडेट करता है, तो उनके लिए git submodule update करेगा, मान लीजिए कि इसे प्रारंभ किया गया है।


ऐसा लगता है कि इस चर्चा में 2 अलग-अलग परिदृश्य एकत्र किए जा रहे हैं:

दृष्टांत 1

मेरे माता-पिता रेपो के पॉइंटर्स को सबोडोड्यूल में उपयोग करना, मैं प्रत्येक सबमिशन में प्रतिबद्धता को देखना चाहता हूं, कि माता-पिता रेपो सभी सबडोड्यूल के माध्यम से पहले पुन: प्रयास करने और रिमोट से इन्हें खींचने / खींचने के बाद इंगित कर रहा है।

जैसा कि बताया गया है, के साथ किया गया है

git submodule foreach git pull origin BRANCH
git submodule update

परिदृश्य 2, जो मुझे लगता है कि ओपी क्या लक्ष्य रख रहा है

नई सामग्री 1 या अधिक submodules में हुई है, और मैं 1) इन परिवर्तनों को खींचना चाहता हूं और 2) इस / इन submodules की HEAD (नवीनतम) प्रतिबद्धता को इंगित करने के लिए पैरेंट रेपो अद्यतन करें।

यह किया जाएगा

git submodule foreach git pull origin BRANCH
git add module_1_name
git add module_2_name
......
git add module_n_name
git push origin BRANCH

बहुत व्यावहारिक नहीं है, क्योंकि आपको माता-पिता रेपो के प्रतिबद्ध पॉइंटर्स को अपडेट करने के लिए एक स्क्रिप्ट जैसे सभी एन submodules में n पथ को हार्डकोड करना होगा।

सबमिशन के प्रमुख को इंगित करने के लिए पैरेंट रेपो पॉइंटर (गिट एड का उपयोग करके) को अद्यतन करने के लिए प्रत्येक सबमिशन के माध्यम से स्वचालित पुनरावृत्ति के लिए अच्छा होगा।

इसके लिए, मैंने यह छोटा बैश-स्क्रिप्ट बनाया है:

git-update-submodules.sh

#!/bin/bash

APP_PATH=$1
shift

if [ -z $APP_PATH ]; then
  echo "Missing 1st argument: should be path to folder of a git repo";
  exit 1;
fi

BRANCH=$1
shift

if [ -z $BRANCH ]; then
  echo "Missing 2nd argument (branch name)";
  exit 1;
fi

echo "Working in: $APP_PATH"
cd $APP_PATH

git checkout $BRANCH && git pull --ff origin $BRANCH

git submodule sync
git submodule init
git submodule update
git submodule foreach "(git checkout $BRANCH && git pull --ff origin $BRANCH && git push origin $BRANCH) || true"

for i in $(git submodule foreach --quiet 'echo $path')
do
  echo "Adding $i to root repo"
  git add "$i"
done

git commit -m "Updated $BRANCH branch of deployment repo to point to latest head of submodules"
git push origin $BRANCH

इसे चलाने के लिए, निष्पादित करें

git-update-submodules.sh /path/to/base/repo BRANCH_NAME

विस्तार

सबसे पहले, मुझे लगता है कि नाम $ शाखा के साथ शाखा (दूसरा तर्क) सभी रेपो पर मौजूद है। इसे और भी जटिल बनाने के लिए स्वतंत्र महसूस करें।

पहले जोड़े अनुभाग कुछ जांच कर रहे हैं कि तर्क वहां हैं। फिर मैं पैरेंट रेपो की नवीनतम चीजें खींचता हूं (जब भी मैं खींच रहा हूं, मैं --ff (फास्ट-फॉरवर्डिंग) का उपयोग करना पसंद करता हूं। मैंने रिबेस बंद कर दिया है, बीटीडब्ल्यू)।

git checkout $BRANCH && git pull --ff origin $BRANCH

फिर कुछ सबमिशन प्रारंभ करना आवश्यक हो सकता है, यदि नए सबमिड्यूल जोड़े गए हैं या अभी तक प्रारंभ नहीं किए गए हैं:

git submodule sync
git submodule init
git submodule update

फिर मैं सभी submodules अद्यतन / खींचें:

git submodule foreach "(git checkout $BRANCH && git pull --ff origin $BRANCH && git push origin $BRANCH) || true"

कुछ चीजों पर ध्यान दें: सबसे पहले, मैं कुछ गिट कमांड का उपयोग कर रहा हूं && - जिसका अर्थ है कि पिछले कमांड को w / o त्रुटि निष्पादित करनी होगी।

संभव सफल खींचने के बाद (अगर रिमोट पर नई चीजें पाई गईं), तो मैं यह सुनिश्चित करने के लिए एक धक्का करता हूं कि क्लाइंट पर संभावित विलय-प्रतिबद्धता पीछे नहीं छोड़ी गई है। दोबारा, केवल तब होता है जब एक पुल वास्तव में नई चीजों में लाया जाता है।

अंत में, अंतिम || true || true यह सुनिश्चित कर रहा है कि स्क्रिप्ट त्रुटियों पर जारी रहे। इस काम को करने के लिए, पुनरावृत्ति में सब कुछ डबल-कोट्स में लपेटा जाना चाहिए और गिट-कमांड पैराथेसिस (ऑपरेटर प्राथमिकता) में लिपटे हैं।

मेरा पसंदीदा हिस्सा:

for i in $(git submodule foreach --quiet 'echo $path')
do
  echo "Adding $i to root repo"
  git add "$i"
done

--quiet साथ सभी submodules --quiet , जो 'MODULE_PATH दर्ज करना' आउटपुट को हटा देता है। 'echo $path' का उपयोग करना (एकल-कोट्स में होना चाहिए), सबमिशन का पथ आउटपुट पर लिखा जाता है।

रिश्तेदार सबमिशन पथों की यह सूची एक सरणी ( $(...) ) में कैप्चर की जाती है - अंत में इसे फिर से करें और git add $i को पेरेंट रेपो अपडेट करने के git add $i

आखिरकार, कुछ संदेश के साथ एक प्रतिबद्धता बताती है कि अभिभावक रेपो अपडेट किया गया था। अगर कुछ भी नहीं किया गया तो यह प्रतिबद्धता डिफ़ॉल्ट रूप से अनदेखा कर दी जाएगी। इसे मूल पर पुश करें, और आप कर चुके हैं।

मेरे पास एक जेनकिन्स-जॉब में चल रही एक स्क्रिप्ट है, जो बाद में एक स्वचालित स्वचालित तैनाती की श्रृंखला है, और यह एक आकर्षण की तरह काम करता है।

मुझे उम्मीद है कि यह किसी के लिए मदद करेगा।


गिट 1.8.2 में एक नया विकल्प है - --remote जो वास्तव में इस व्यवहार को सक्षम करेगा। चल रहा है

git submodule update --remote --merge

प्रत्येक सबमिशन में अपस्ट्रीम से नवीनतम परिवर्तन लाएगा, उन्हें मर्ज करें, और सबमिशन के नवीनतम संशोधन की जांच करें। जैसे दस्तावेज़ों ने इसे रखा:

--remote

यह विकल्प केवल अद्यतन कमांड के लिए मान्य है। सबमिशन को अद्यतन करने के लिए सुपरप्रोजेक्ट के रिकॉर्ड किए गए SHA-1 का उपयोग करने के बजाय, सबमिशन की रिमोट-ट्रैकिंग शाखा की स्थिति का उपयोग करें।

यह प्रत्येक सबमिशन में git pull चलाने के बराबर है, जो आमतौर पर वही है जो आप चाहते हैं।


सबमिड्यूल लाने के लिए सादा और सरल:

git submodule update --init --recursive

और अब उन्हें नवीनतम मास्टर शाखा में अपडेट करना जारी रखें (उदाहरण के लिए):

git submodule foreach git pull origin master

git submodule update कमांड वास्तव में गिट को बताता है कि आप अपने प्रोडोड्यूल को सुपरप्रोजेक्ट के इंडेक्स में पहले से निर्दिष्ट प्रतिबद्धता को जांचने के लिए चाहते हैं। यदि आप अपने रिमोट से उपलब्ध नवीनतम प्रतिबद्धता में अपने सबोडोड्यूल को अपडेट करना चाहते हैं, तो आपको इसे सीधे submodules में करना होगा।

तो संक्षेप में:

# get the submodule initially
git submodule add ssh://bla submodule_dir
git submodule init

# time passes, submodule upstream is updated
# and you now want to update

# change to the submodule directory
cd submodule_dir

# checkout desired branch
git checkout master

# update
git pull

# get back to your project root
cd ..

# now the submodules are in the state you want, so
git commit -am "Pulled down update to submodule_dir"

या, यदि आप एक व्यस्त व्यक्ति हैं:

git submodule foreach git pull origin master




git-submodules