2013-06-14 6 views
16

अपडेट करने के लिए एक शेल स्क्रिप्ट बनाएं, मैं अपने विकास पर्यावरण में क्लोन किए गए 5 रिपोज़ के साथ काम कर रहा हूं। जब मैं एक Git रेपो अद्यतन करना चाहते, मैं फ़ोल्डर/घर/एड्रियन/repo1 दर्ज/और कार्य करें:3 गीट रिपोज़

Git चेकआउट मास्टर Git पुल मूल मास्टर

लेकिन फिर भी, हर सुबह मैं क्या करना है अन्य 4 repos के लिए एक ही बात है। यह काफी परेशानी है।

क्या मैं इसे एक शेल स्क्रिप्ट में रख सकता हूं? मेरा मतलब है, अगर मैं शेल स्क्रिप्ट में इन गिट कमांड लिखता हूं, और इसे चलाता हूं, तो क्या मैं सभी रिपोज़ अपडेट कर पाऊंगा?

मैं कुछ इस तरह लिखने की सोच रहा था ...

cd repo1 
git checkout master 
git pull origin master 
cd .. 
cd repo2 
git checkout master 
git pull origin master 
cd .. 

(मैं लिनक्स पर हूँ)

संपादित करें: शायद यह है कि मैं क्या सोचा था की तुलना में अधिक चुनौतीपूर्ण है। ज्यादातर बार जब मैं "गिट पुल मूल मास्टर" करता हूं, तो मुझे "आपके स्थानीय परिवर्तन .... जैसे त्रुटियों को विलय करके अधिलेखित किया जाएगा।" तो मैं संबंधित शाखा में प्रवेश करने और सामान भी छिपा सकते .. है

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

क्या मैं क्या कर रहा है, कोई विरोध होता है अगर, इसे अनदेखा और अगले रेपो के लिए जाने की सोच रहा हूँ

cd repo1 
git checkout master 
git pull origin master 

(if there is conflict, ignore and go to the next line but dont stop here) 

cd .. 
cd repo2 
git checkout master 
git pull origin master 
cd .. 

लेकिन मुझे नहीं पता कि यह कैसे संश्लेषण में लिखना है।

+0

तुम्हारे पास क्या है अगर जब आप चेकआउट करने का प्रयास करते हैं तो दूसरी शाखा में अपरिचित परिवर्तन? अगर आप खींचते हैं तो आपके पास संघर्ष होता है? थर्म ई सिद्धांत में कुछ भी गलत नहीं है जो आप करना चाहते हैं, लेकिन आपको यह सोचने की आवश्यकता है कि आपके आदेश क्यों विफल हो सकते हैं (और फिर क्या करें) – bengoesboom

+0

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

+0

मुझे लगता है कि आप 'svn' तरीके से 'git' का उपयोग करके, हर दिन रिमोट पर ट्रैक रखना चाहते हैं। वास्तव में 'गिट' एक डीवीडी है, आप स्थानीय में अपना काम कर सकते हैं और पुश से पहले 'गिट पुल - रेबेस' लॉन्च कर सकते हैं। यह स्रोत को रिमोट से खींच देगा और उस पर आपका परिवर्तन लागू करेगा, इससे संघर्ष हो सकता है लेकिन हल किया जा सकता है। – dyng

उत्तर

23

पहला, मैं recommend against using git pull

git config --global alias.up '!git remote update -p; git merge --ff-only @{u}' 

git up के लिए स्पष्टीकरण this answer देखें: इसके बजाय, एक सुरक्षित git up उपनाम बना।

तो आप कर सकते हैं सुरक्षित रूप से स्क्रिप्ट यह:

#!/bin/sh 
for repo in repo1 repo2 repo3 repo4; do 
    (cd "${repo}" && git checkout master && git up) 
done 
+0

धन्यवाद! आपने मुझे मना लिया! कोई और गिट खींचें – ado

+0

बीटीडब्ल्यू इसे लिखने के लिए जरूरी है: ... गिट चेकआउट मास्टर (सीडी "$ {repo}" && git up) .... लूप में? – ado

+0

@adriancdperu: यह आपकी प्राथमिकताओं/परिस्थितियों पर निर्भर करता है। यदि आप वर्तमान में चेक-आउट शाखा को अपडेट करना चाहते हैं, तो नहीं; अगर आप केवल 'मास्टर' को अपडेट करना चाहते हैं तो हाँ। (मेरे पास उस सरल 'गिट अप' उपनाम का एक प्रशंसक संस्करण है जिसका उपयोग मैं अपनी सभी शाखाओं को एक बार में अपडेट करने के लिए करता हूं। इस प्रकार, मुझे कभी भी 'गिट चेकआउट' की आवश्यकता नहीं है।) –

2

जैसा कि मैंने कई Git रेपो के काम के लिए स्थानीय स्तर पर की जाँच की, मैं सभी रेपो के (bash स्क्रिप्ट Git के लिए खोज करेंगे अद्यतन करने के लिए एक अधिक विस्तृत स्क्रिप्ट लिखने का फैसला किया है 3 फ़ोल्डरों गहरी करने के लिए रेपोस अद्यतन करने के लिए। यह तो एक git छिपाने की जगह क्या करेंगे, लाने, rebase, और स्थानीय परिवर्तनों को वापस पॉप छिपाया। स्क्रिप्ट मेरे लिए खिड़कियों पर Git बैश खोल में चलाता है।

#!/bin/bash 
# Usage: 
# ./update_git_repos.sh [parent_directory] 
# example usage: 
#  ./update_git_repos.sh C:/GitProjects/ [MAKE SURE YOU USE/SLASHES] 

updateRepo() { 
    local dir="$1" 
    local original_dir="$2" 
    cd $dir # switch to the git repo 
    repo_url=$(git config --get remote.origin.url) 

    echo "****************************************************************************" 
    echo "Updating Repo: $dir with url: $repo_url" 
    echo "Starting update in $PWD" 

    main_branch="master" 
    if [ "$repo_url" == "[email protected]:repo/repo.git" ]; then # if you have a repo where the primary branch isnt master 
     $main_branch="trunk" 
    fi 

    # update the repo, then stash any local changes 
    echo -e "\ncalling: git fetch --all && git stash" 
    (git fetch --all && git stash) 
    current_branch=$(git rev-parse --abbrev-ref HEAD) 

    # switch to master/trunk branch and rebase it, then switch back to original branch 
    if [ $current_branch != $main_branch ]; then 
     echo -e "\ncalling: git checkout $main_branch && git rebase && git checkout $current_branch" 
     (git checkout $main_branch && git rebase && git checkout $current_branch) 
    fi 

    # rebase the original branch and then stash pop back to original state 
    echo -e "\ncalling: git rebase && git stash pop on branch: $current_branch" 
    (git rebase && git stash pop) 

    #switch back to the starting directory 
    cd $original_dir 
    echo "" 
} 

directory_to_update=${1} 

if [ -z "$directory_to_update" ] ; then 
    echo "no directory passed in, using current directory" 
    directory_to_update=$PWD 
fi 
echo "Updating git repo's in directory: $directory_to_update" 
count=0 
for dir in $(find $directory_to_update -maxdepth 4 -type d -name .git | xargs -n 1 dirname); do 
    updateRepo $dir $directory_to_update #& #uncomment to make it run in multiple threads, meh 
    ((count+=1)) 
done 

echo "$count local git repos have been updated!" 
संबंधित मुद्दे