गिट पुश का उपयोग करके एक परियोजना को तैनात करें


412

क्या किसी वेबसाइट का उपयोग करना संभव है git push? मेरे पास एक कूबड़ है जो सर्वर साइड पर प्रदर्शन करने के लिए गिट हुक का उपयोग करने के साथ कुछ करना है git reset --hard, लेकिन मैं इसे पूरा करने के बारे में कैसे जाऊंगा?


2
मुझे लगता है कि यह केवल उन स्थितियों में लागू होगा जहां केवल एक उत्पादन सर्वर है, है ना?
रिज्क

6
@ रीजक वेल, आप Git के साथ कई सर्वरों को एक साथ पुश कर सकते हैं, लेकिन एक बार जब आप उस स्तर तक पहुँच जाते हैं, तो आप एक वास्तविक समाधान चाहते हैं, इस तरह से हैक नहीं कर सकते।
काइल क्रोनिन

मुझे अपनी परियोजनाओं के साथ कैपिस्ट्रानो का उपयोग करने में सफलता मिली है , जो कि मूल रूप से रूबी ऑन रेल्स तैनाती के लिए डिज़ाइन की गई थी, PHP और अन्य परियोजनाओं के साथ अच्छी तरह से काम करती है।

Ru.so पर रूसी में दिए गए उत्तरों का अनुवाद किया: ru.stackoverflow.com/questions/428483/…
Nick Volynkin

जवाबों:


287

मुझे इस साइट पर स्क्रिप्ट मिली और यह काफी अच्छी तरह से काम करती है।

  1. अपने वेब सर्वर पर अपनी .गित निर्देशिका पर कॉपी करें
  2. अपनी स्थानीय प्रति पर, अपनी .it / config फ़ाइल को संशोधित करें और अपने वेब सर्वर को रिमोट के रूप में जोड़ें:

    [remote "production"]
        url = username@webserver:/path/to/htdocs/.git
    
  3. सर्वर पर, .git / हुक / पोस्ट-अपडेट को इस फ़ाइल के साथ बदलें (नीचे दिए गए उत्तर में)

  4. फ़ाइल तक पहुँच निष्पादित करें (फिर से, सर्वर पर):

    chmod +x .git/hooks/post-update
    
  5. अब, बस स्थानीय रूप से अपने वेब सर्वर पर धकेलें और इसे स्वचालित रूप से कार्य की प्रति अपडेट करनी चाहिए:

    git push production
    

128
सुनिश्चित करें कि आपके पास एक .htaccess नीति है जो .गित निर्देशिका को पढ़ने से बचाती है। कोई व्यक्ति जो URL डाइविंग की तरह महसूस करता है, अगर वह सुलभ हो तो पूरे स्रोत कोड के साथ एक फ़ील्ड दिन हो सकता है।
जेफ फेरलैंड

39
वैकल्पिक रूप से सार्वजनिक निर्देशिका को गिट रेपो का उपनिर्देशिका बनाएं। फिर आपके पास निजी फाइलें हो सकती हैं जिन्हें आप सुनिश्चित कर सकते हैं कि उन्हें सार्वजनिक नहीं किया जाएगा।
tlrobinson

3
यह लिंक मर चुका है। क्या पोस्ट-अपडेट फ़ाइल का एक और लिंक है?
रॉबर्ट हर्स्ट

6
शायद मुझे कुछ याद आ रहा है, लेकिन आप अपने प्रोडक्शन सर्वर को मास्टर गिट रिपोजिटरी प्रोडक्टेशन ब्रांच से नहीं खींचना चाहेंगे । मुझे लगता है कि ओपी में केवल एक सर्वर है? मैं आमतौर पर अपने निरंतर एकीकरण सर्वर को मेरी साइट की तैनाती (तैनाती से पहले कुछ परीक्षण चलाने) करता हूं।
एडम जेंट

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

80

नीचे पोस्ट-अपडेट फ़ाइल का उपयोग करना :

  1. अपने वेब सर्वर पर अपनी .गित निर्देशिका पर कॉपी करें
  2. अपनी स्थानीय प्रति पर, अपनी .it / config फ़ाइल को संशोधित करें और अपने वेब सर्वर को रिमोट के रूप में जोड़ें:

    [remote "production"]
        url = username@webserver:/path/to/htdocs/.git
    
  3. सर्वर पर, नीचे फ़ाइल के साथ .git / हुक / पोस्ट-अपडेट बदलें

  4. फ़ाइल तक पहुँच निष्पादित करें (फिर से, सर्वर पर):

    chmod +x .git/hooks/post-update
    
  5. अब, बस स्थानीय रूप से अपने वेब सर्वर पर धकेलें और इसे स्वचालित रूप से कार्य की प्रति अपडेट करनी चाहिए:

    git push production
    
#!/bin/sh
#
# This hook does two things:
#
#  1. update the "info" files that allow the list of references to be
#     queries over dumb transports such as http
#
#  2. if this repository looks like it is a non-bare repository, and
#     the checked-out branch is pushed to, then update the working copy.
#     This makes "push" function somewhat similarly to darcs and bzr.
#
# To enable this hook, make this file executable by "chmod +x post-update". 
git-update-server-info 
is_bare=$(git-config --get --bool core.bare) 
if [ -z "$is_bare" ]
then
      # for compatibility's sake, guess
      git_dir_full=$(cd $GIT_DIR; pwd)
      case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
fi 
update_wc() {
      ref=$1
      echo "Push to checked out branch $ref" >&2
      if [ ! -f $GIT_DIR/logs/HEAD ]
      then
             echo "E:push to non-bare repository requires a HEAD reflog" >&2
             exit 1
      fi
      if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null)
      then
             wc_dirty=0
      else
             echo "W:unstaged changes found in working copy" >&2
             wc_dirty=1
             desc="working copy"
      fi
      if git diff-index --cached HEAD@{1} >/dev/null
      then
             index_dirty=0
      else
             echo "W:uncommitted, staged changes found" >&2
             index_dirty=1
             if [ -n "$desc" ]
             then
                   desc="$desc and index"
             else
                   desc="index"
             fi
      fi
      if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]
      then
             new=$(git rev-parse HEAD)
             echo "W:stashing dirty $desc - see git-stash(1)" >&2
             ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT
             git-update-ref --no-deref HEAD HEAD@{1}
             cd $GIT_WORK_TREE
             git stash save "dirty $desc before update to $new";
             git-symbolic-ref HEAD "$ref"
             )
      fi 
      # eye candy - show the WC updates :)
      echo "Updating working copy" >&2
      (cd $GIT_WORK_TREE
      git-diff-index -R --name-status HEAD >&2
      git-reset --hard HEAD)
} 
if [ "$is_bare" = "false" ]
then
      active_branch=`git-symbolic-ref HEAD`
      export GIT_DIR=$(cd $GIT_DIR; pwd)
      GIT_WORK_TREE=${GIT_WORK_TREE-..}
      for ref
      do
             if [ "$ref" = "$active_branch" ]
             then
                   update_wc $ref
             fi
      done
fi

5
Geez ... बस इस लिपि को उस भाषा पर लिखें जिसे आप विकास के लिए उपयोग कर रहे हैं यह php, python, groovy या जो भी हो! मैंने शेल स्क्रिप्ट के लिए इस प्यार को कभी नहीं समझा, जो (विषयवस्तु) काफी अजीब वाक्यविन्यास और इतनी कम कार्यात्मक विशेषताएं हैं।
dVaffection

4
यदि आप git का उपयोग कर रहे हैं तो किसी भी स्थिति में @VVection आप शेल कमांड लिखने जा रहे हैं। इसलिए किसी अन्य भाषा में एक स्क्रिप्ट लिखने के बजाय और उस भाषा और शेल के बीच लगातार जॉगिंग करें। शेल में यह सब लिखना तर्कसंगत लगता है क्या आपको नहीं लगता?
अबदर्रहमान TAHRI JOUTI

मुझे सर्वर पर भी 'git config receive.denyCurrentBranch updateInstead' का प्रदर्शन करना था, ताकि वह पुश स्वीकार कर ले। मुझे लगता है कि इसकी वजह से शाखा की जाँच की गई थी?
स्टैकपशर

60

कई झूठी शुरुआत और मृत समाप्त होने के बाद, मैं अंत में इस लेख के लिए "गिट पुश रिमोट " के साथ वेबसाइट कोड को तैनात करने में सक्षम हूं ।

लेखक की पोस्ट-अपडेट स्क्रिप्ट केवल एक पंक्ति लंबी है और उसके समाधान के लिए .htaccess कॉन्फ़िगरेशन की आवश्यकता नहीं होती है जैसे Git रेपो को छिपाने के लिए अन्य लोग करते हैं।

यदि आप इसे Amazon EC2 उदाहरण पर तैनात कर रहे हैं, तो ठोकरें खाने वाले कुछ जोड़े;

1) यदि आप नंगे गंतव्य भंडार बनाने के लिए sudo का उपयोग करते हैं, तो आपको रेपो के मालिक को ec2-user में बदलना होगा या पुश विफल हो जाएगा। (कोशिश करें "chown ec2-user: ec2-user repo ।")

2) यदि आप अपने amazon- Private-key .pem के स्थान को प्री-कॉन्फिगर नहीं करते हैं , तो / etc / ssh / ssh_config में IdentityFile पैरामीटर के रूप में या ~ / .ssh / config में " पूर्व-कॉन्फ़िगर नहीं करेगा"। होस्ट] - HostName - IdentityFile - उपयोगकर्ता " यहाँ वर्णित लेआउट ...

... यदि होस्ट होस्ट कॉन्फ़िगर किया गया है ~ / .sh / config और HostName से अलग Git पुश विफल हो जाएगा। (यह शायद एक बग बग है)


मैंने आपके द्वारा बताए गए लेख में चरणों का पालन किया, और सब कुछ एक आकर्षण की तरह काम किया। मुझे केवल आश्चर्य है कि सुरक्षा या स्थिरता से संबंधित कुछ कमियां हैं। इस पर कोई सलाह?
xlttj

xl-t: मान लें कि आप SSH पर Git का उपयोग कर रहे हैं, मैं कहूंगा कि Git के साथ गलती करने में खतरा निहित है। आप लेख के लेखक से पूछ सकते हैं; वह "सवालों और सुझावों का स्वागत करते हैं।" मेरा वर्तमान (मस्तिष्क-मृत) प्रतिकृति रणनीति आतंक सॉफ्टवेयर द्वारा ट्रांसमिट का उपयोग करना है।
अर्ल जेडड

1
जब आप हुक का उपयोग करते हैं तो लिंक किए गए लेख की एक महत्वपूर्ण आवश्यकता होती है। यदि कार्यशील निर्देशिका के समान नामकरण स्कीम में .It होता है तो हुक विफल हो जाएंगे। यानी / फू / बार (वर्किंग डायरेक्टरी) और /foo/bar.git (नंगे पांव रिपॉजिटरी)। इसलिए सुनिश्चित करें कि आप नाम / foo / बार को किसी और चीज़ में, जैसे /foo/bar.live या / foo / blah अच्छी तरह से कर रहे हैं, यदि आप सोच रहे हैं, तो सटीक त्रुटि संदेश आपको प्राप्त होगा यदि आपकी वर्किंग डायरेक्टरी में समान नाम है बेयरबोन रिपॉजिटरी "रिमोट: घातक: है: वापस मूल cwd में नहीं कूद सकता है: ऐसी कोई फ़ाइल या निर्देशिका नहीं"
एंटोनी

1
मैं इस बात का पालन नहीं करता कि आपको चलाने के लिए पोस्ट-पोस्ट हुक की आवश्यकता क्यों होगी। रिमोट रेपो में कोड में बदलाव करने का मतलब है कि रिमोट रेपो अप टू डेट है। मैं क्या खो रहा हूँ?
चार्ली श्लेसीयर

1
@CharlieS जो आपको याद आ रहा है वह यह है कि git आपको उस शाखा को एक रिपॉजिटरी में धकेलने नहीं देगा जिसने उस शाखा की जाँच की है। इस मामले में, (IMHO बहुत अच्छा) उत्तर में दो रिपॉजिटरी हैं: एक नंगे रेपो जिसे आप पुश करते हैं और दूसरा रेपो जिसका वर्किंग डायरेक्टरी हुक के माध्यम से अपडेट किया जाता है जब नंगे रेपो को धक्का दिया जाता है।
बेन ह्यूजेस

21

किसी सर्वर पर गिट स्थापित न करें या .गित फ़ोल्डर की प्रतिलिपि बनाएँ। एक git क्लोन से एक सर्वर को अपडेट करने के लिए आप निम्नलिखित कमांड का उपयोग कर सकते हैं:

git ls-files -z | rsync --files-from - --copy-links -av0 . user@server.com:/var/www/project

आपको उन फ़ाइलों को हटाना पड़ सकता है जिन्हें परियोजना से हटा दिया गया था।

यह सभी जाँच की गई फ़ाइलों की प्रतिलिपि बनाता है। rsync ssh का उपयोग करता है जो किसी भी तरह सर्वर पर संस्थापित होता है।

कम सॉफ्टवेयर जो आपने सर्वर पर इंस्टॉल किया है वह उतना ही अधिक सुरक्षित है और इसे कॉन्फ़िगर करना और इसे प्रलेखित करना उतना ही आसान है। सर्वर पर एक पूर्ण git क्लोन रखने की भी आवश्यकता नहीं है। यह सब कुछ ठीक से सुरक्षित करने के लिए केवल अधिक जटिल बनाता है।


3
एक चेतावनी: यह आपके कार्य निर्देशिका में आपके पास मौजूद फ़ाइलों को rsync करेगा। मुझे लगता है कि यह एक स्क्रिप्ट का उपयोग करके बचा जा सकता है जो वर्तमान परिवर्तनों को चुराता है, सब कुछ साफ करता है, तैनात करता है और फिर टकराव को हटा देता है।
mateusz.fiolka

सेवक पुरुष हैं?
इयान वारबर्टन

12

संक्षेप में आपको बस इतना करने की आवश्यकता है:

server = $1
branch = $2
git push $server $branch
ssh <username>@$server "cd /path/to/www; git pull"

मेरे पास मेरे आवेदन में उन पंक्तियों को एक निष्पादन योग्य कहा जाता है deploy

इसलिए जब मैं एक तैनाती करना चाहता हूं तो मैं टाइप करता हूं ./deploy myserver mybranch


यदि आप ssh के लिए एक अलग निजी कुंजी या उपयोगकर्ता नाम की जरूरत है, तो समस्या को हल करने के बारे में मेरा जवाब देखें
Karussell

जब कई सर्वरों पर तैनाती होती है तो यह समाधान मेरे खुद के मुकाबले तेज होता है! बस मुख्य रेपो को धक्का दें और इसके समानांतर समानांतर में खींचें। और अगर आप नहीं चाहते या हर कुंजी एजेंट का उपयोग करने के लिए अपनी चाबियाँ तैनात नहीं कर सकते! ssh -A ...
Karussell

1
यह आसान होगा यदि आप SSH कुंजी सेट करने पर एक गाइड शामिल करते हैं जो यह उत्तर 'मूल रूप से' काम करने के लिए निर्भर करता है
हेंगजी

git pullस्वचालित तैनाती के लिए उपयोग से बचा जाना चाहिए क्योंकि इसके विलय वाले हिस्से को मैनुअल सफाई की आवश्यकता हो सकती है यदि कोई संघर्ष हो।
क्विन कॉमेंडेंट

9

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


नए कोड में त्रुटि के मामले में, क्या आप प्रति कम या पूरे पुल को रीसेट करते हैं? (या केवल 1 संभव है?)
रूडी

1
@Rudie: यदि आपको परिनियोजन सर्वर पर परिवर्तन वापस करने की आवश्यकता है, तो आप नवीनतम परिवर्तनों के git resetबीच वापस जाने के लिए उपयोग कर सकते हैं (सभी कमिट्स, न कि पूरे पुल)। यदि आपको कुछ विशिष्ट रोल करने की आवश्यकता है जो कि नवीनतम कमिट नहीं है, तो आप उपयोग कर सकते हैं, लेकिन इसका उपयोग शायद केवल आपात स्थितियों में किया जाना चाहिए ( एक नई प्रतिबद्ध बनाता है जो कुछ पिछले प्रतिबद्ध के प्रभाव को कम करता है)। git revertgit revert
ग्रेग हेवगिल सेप

बस जिज्ञासा से बाहर: आपको क्या लगता है कि हुक इसके लिए इसके लायक होने की तुलना में अधिक परेशानी होगी?
रिज्क

@Rijk: इसके लिए हुक का उपयोग करते समय, वास्तविक वेब सर्वर डॉक्स निर्देशिका को स्वचालित पृष्ठभूमि प्रक्रिया द्वारा बदल दिया जाता है। जब डॉक्स निर्देशिका में परिवर्तन लागू होते हैं, तो मुझे लॉग इन करने पर अधिक नियंत्रण होता है। इसके अलावा, चीजों को गलत होने पर ठीक करना आसान है। यदि वेब सर्वर में लॉग इन करने के लिए पर्याप्त पहुंच नहीं है तो हुक अधिक उपयुक्त हो सकते हैं।
ग्रेग हेविगिल

तो आपका वास्तविक webapp फोल्डर भी एक .it रिपॉजिटरी है? .It फ़ोल्डर के बारे में क्या, यह बाहरी दुनिया को दिखाई देता है?
फर्नांडो

9

git config --local receive.denyCurrentBranch updateInstead

Git 2.3 में जोड़ा गया, यह एक अच्छी संभावना हो सकती है: https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155

आप इसे सर्वर रिपॉजिटरी पर सेट करते हैं, और अगर यह साफ है तो यह काम करने वाले पेड़ को भी अपडेट करता है।

2.4 push-to-checkoutमें अजन्मे शाखाओं के हुक और हैंडलिंग में और सुधार किए गए हैं

नमूना उपयोग:

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

आउटपुट:

a
b

यह GitHub घोषणा पर उल्लिखित निम्न कमियां हैं :

  • आपके सर्वर में .it निर्देशिका होगी जिसमें आपकी परियोजना का पूरा इतिहास होगा। आप शायद यह सुनिश्चित करना चाहते हैं कि इसे उपयोगकर्ताओं को नहीं दिया जा सकता है!
  • Deploys के दौरान, उपयोगकर्ताओं के लिए यह संभव होगा कि वे साइट पर असंगत स्थिति में साइट का सामना कर सकें, पुराने संस्करण में कुछ फाइलें और नए संस्करण में अन्य, या यहां तक ​​कि आधे-लिखित फ़ाइलों के साथ। यदि यह आपके प्रोजेक्ट के लिए एक समस्या है, तो पुश-टू-परिनियोजन संभवतः आपके लिए नहीं है।
  • यदि आपकी परियोजना को "बिल्ड" चरण की आवश्यकता है, तो आपको इसे स्पष्ट रूप से सेट करना होगा, शायद गिथुक के माध्यम से।

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


इसे सेट करने के लिए, इस कमांड को चलाएँ: 'git config get.denyCurrentBranch updateInstead' टर्मिनल में
stackPusher

5

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


इस समाधान को यहां नहीं देख रहे हैं। अगर सर्वर पर git स्थापित है तो ssh के माध्यम से धक्का दें।

आपको अपने स्थानीय .git / config में निम्नलिखित प्रविष्टि की आवश्यकता होगी

[remote "amazon"]
    url = amazon:/path/to/project.git
    fetch = +refs/heads/*:refs/remotes/amazon/*

लेकिन हे, क्या साथ है amazon:? आपके स्थानीय ~ / .ssh / config में आपको निम्नलिखित प्रविष्टि जोड़ने की आवश्यकता होगी:

Host amazon
    Hostname <YOUR_IP>
    User <USER>
    IdentityFile ~/.ssh/amazon-private-key

अब आप कॉल कर सकते हैं

git push amazon master
ssh <USER>@<YOUR_IP> 'cd /path/to/project && git pull'

(BTW: /path/to/project.git वास्तविक वर्किंग डायरेक्टरी / पाथ / टू / प्रोजेक्ट के लिए अलग है)


5

परिनियोजन परिदृश्य के लिए

हमारे परिदृश्य में हम github / bitbucket पर कोड स्टोर कर रहे हैं और लाइव सर्वर पर तैनात करना चाहते हैं। इस मामले में निम्नलिखित संयोजन हमारे लिए काम करता है (जो कि यहाँ अत्यधिक उत्कीर्ण उत्तरों का एक रीमिक्स है) :

  1. अपनी .gitनिर्देशिका को अपने वेब सर्वर पर कॉपी करें
  2. अपनी स्थानीय प्रति पर git remote add live ssh://user@host:port/folder
  3. रिमोट पर: git config receive.denyCurrentBranch ignore
  4. दूरस्थ पर: nano .git/hooks/post-receiveऔर यह सामग्री जोड़ें:

    #!/bin/sh GIT_WORK_TREE=/var/www/vhosts/example.org git checkout -f

  5. रिमोट पर: chmod +x .git/hooks/post-receive

  6. अब आप वहाँ के साथ धक्का कर सकते हैं git push live

टिप्पणियाँ

  • यह समाधान पुराने git संस्करणों के साथ काम करता है (1.7 और 1.9 के साथ परीक्षण किया गया)
  • आपको पहले जीथब / बिटबकेट पर जोर देना सुनिश्चित करना होगा, ताकि आपके पास लाइव पर एक सुसंगत रेपो हो
  • यदि आपका .gitफ़ोल्डर दस्तावेज़ रूट के भीतर है, तो सुनिश्चित करें कि आप इसे .htaccess( स्रोत ) से जोड़कर बाहर से छिपाते हैं :

    RedirectMatch 404 /\..*$


4

हम तैनाती को प्रबंधित करने के लिए कैपिस्ट्रानो का उपयोग करते हैं। हम एक स्टेजिंग सर्वर पर तैनात करने के लिए capistrano का निर्माण करते हैं, और फिर हमारे सभी सर्वर के साथ rsync चलाते हैं।

cap deploy
cap deploy:start_rsync (when the staging is ok)

कैपिस्ट्रानो के साथ, हम बग के मामले में आसान रोलबैक कर सकते हैं

cap deploy:rollback
cap deploy:start_rsync

क्या आपने लाइव तैनाती को rsync के माध्यम से कैपिस्ट्रानो में एकीकृत किया है?
मार्टिन अब्राहम

2

Giddyup भाषा-अज्ञेयवादी हैं- add- git हुक के माध्यम से तैनाती को स्वचालित करने के लिए पानी जोड़ हुक। यह आपको वेब सर्वर को पुनरारंभ करने, कैश को गर्म करने आदि के लिए कस्टम स्टार्ट / स्टॉप हुक की भी अनुमति देता है।

https://github.com/mpalmer/giddyup

की जाँच करें उदाहरण


1

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


1

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

वैकल्पिक रूप से क्या आपने इसके स्थान पर साइट को बदलने पर जोर दिया है?

Git हुक की जानकारी के लिए githooks प्रलेखन देखें ।


1

मेरा ईसाई समाधान है।

git archive --prefix=deploy/  master | tar -x -C $TMPDIR | rsync $TMPDIR/deploy/ --copy-links -av username@server.com:/home/user/my_app && rm -rf $TMPDIR/deploy
  • टार में मास्टर शाखा अभिलेखागार
  • सिस्टम अस्थायी फ़ोल्डर में डायर को तैनात करने के लिए टर्क आर्काइव निकालता है।
  • rsync सर्वर में बदलता है
  • अस्थायी फ़ोल्डर से तैनाती dir हटाएं।

1

मैं toroid.org द्वारा निम्नलिखित समाधान का उपयोग कर रहा हूं , जिसमें एक सरल हुक स्क्रिप्ट है।

सर्वर पर:

$ mkdir website.git && cd website.git
$ git init --bare
Initialized empty Git repository in /home/ams/website.git/

और सर्वर पर हुक स्थापित करें:

$ mkdir /var/www/www.example.org
$ cat > hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/var/www/www.example.org git checkout -f
GIT_WORK_TREE=/var/www/www git clean -f -d # clean directory from removed files

$ chmod +x hooks/post-receive

अपने ग्राहक पर:

$ mkdir website && cd website
$ git init
Initialized empty Git repository in /home/ams/website/.git/
$ echo 'Hello, world!' > index.html
$ git add index.html
$ git commit -q -m "The humble beginnings of my web site."

$ git remote add web ssh://server.example.org/home/ams/website.git
$ git push web +master:refs/heads/master

तो प्रकाशित करने के लिए, बस टाइप करें

$ git push web

वेबसाइट पर एक पूरा विवरण है: http://toroid.org/ams/git-website-howto


इस तरह से रिपॉजिटरी में मौजूदा फाइल को डिलीट नहीं करें।
रुसलेक्स

2
git push web +master:refs/heads/masterसिर्फ के बजाय क्यों git push web master?
मथिउ मोय

1

पूरक उत्तर के रूप में मैं एक विकल्प की पेशकश करना चाहूंगा। मैं git-ftp का उपयोग कर रहा हूं और यह ठीक काम करता है।

https://github.com/git-ftp/git-ftp

उपयोग करने के लिए आसान, केवल प्रकार:

git ftp push

और git स्वचालित रूप से प्रोजेक्ट फ़ाइलों को अपलोड करेगा।

सादर


0

एक ऐसे वातावरण को देखते हुए जहाँ आपके पास कई डेवलपर्स एक ही रिपॉजिटरी तक पहुँचने के लिए निम्नलिखित दिशानिर्देशों की मदद कर सकते हैं।

सुनिश्चित करें कि आपके पास एक यूनिक्स समूह है जो सभी देवों का है और उस समूह के लिए .it रिपॉजिटरी का स्वामित्व देते हैं।

  1. सर्वर रिपॉजिटरी के .git / config में शेयर्ड रिपॉजिटरी सेट = सही है। (यह कई उपयोगकर्ताओं को अनुमति देने के लिए गिट बताता है, जो कमिट और तैनाती के लिए आवश्यक है।

  2. प्रत्येक उपयोगकर्ता के umask को उनके bashrc फ़ाइलों में समान होने के लिए सेट करें - 002 एक अच्छी शुरुआत है


0

मैंने अपना स्वयं का अल्पविकसित परिनियोजन टूल बनाया, जो स्वचालित रूप से रेपो से नए अपडेट को खींच लेगा - https://github.com/jesalg/SlimJim - मूल रूप से यह गिथब पोस्ट-हुक प्राप्त करने के लिए सुनता है और प्रॉक्सी को ट्रिगर करने के लिए प्रॉक्सी का उपयोग करता है अद्यतन स्क्रिप्ट।


0

पोस्ट-हुक के लिए मैं दो समाधानों का उपयोग करता हूं:

समाधान समाधान 1

#!/bin/bash 
#  /git-repo/hooks/post-receive - file content on server (chmod as 755 to be executed)
# DEPLOY SOLUTION 1 

    export GIT_DIR=/git/repo-bare.git
    export GIT_BRANCH1=master
    export GIT_TARGET1=/var/www/html
    export GIT_BRANCH2=dev
    export GIT_TARGET2=/var/www/dev
    echo "GIT DIR:  $GIT_DIR/"
    echo "GIT TARGET1:  $GIT_TARGET1/"
    echo "GIT BRANCH1:  $GIT_BRANCH1/"
    echo "GIT TARGET2:  $GIT_TARGET2/"
    echo "GIT BRANCH2:  $GIT_BRANCH2/"
    echo ""

    cd $GIT_DIR/

while read oldrev newrev refname
do
    branch=$(git rev-parse --abbrev-ref $refname)
    BRANCH_REGEX='^${GIT_BRANCH1}.*$'
    if [[ $branch =~ $BRANCH_REGEX ]] ; then
        export GIT_WORK_TREE=$GIT_TARGET1/.
        echo "Checking out branch: $branch";
        echo "Checking out to workdir: $GIT_WORK_TREE"; 

        git checkout -f $branch
    fi

    BRANCH_REGEX='^${GIT_BRANCH2}.*$'
    if [[ $branch =~ $BRANCH_REGEX ]] ; then
        export GIT_WORK_TREE=$GIT_TARGET2/.
        echo "Checking out branch: $branch";
        echo "Checking out to workdir: $GIT_WORK_TREE"; 

        git checkout -f $branch
    fi
done

समाधान समाधान 2

#!/bin/bash 
#  /git-repo/hooks/post-receive - file content on server (chmod as 755 to be executed)
# DEPLOY SOLUTION 2

    export GIT_DIR=/git/repo-bare.git
    export GIT_BRANCH1=master
    export GIT_TARGET1=/var/www/html
    export GIT_BRANCH2=dev
    export GIT_TARGET2=/var/www/dev
    export GIT_TEMP_DIR1=/tmp/deploy1
    export GIT_TEMP_DIR2=/tmp/deploy2
    echo "GIT DIR:  $GIT_DIR/"
    echo "GIT TARGET1:  $GIT_TARGET1/"
    echo "GIT BRANCH1:  $GIT_BRANCH1/"
    echo "GIT TARGET2:  $GIT_TARGET2/"
    echo "GIT BRANCH2:  $GIT_BRANCH2/"
    echo "GIT TEMP DIR1:  $GIT_TEMP_DIR1/"
    echo "GIT TEMP DIR2:  $GIT_TEMP_DIR2/"
    echo ""

    cd $GIT_DIR/

while read oldrev newrev refname
do
    branch=$(git rev-parse --abbrev-ref $refname)
    BRANCH_REGEX='^${GIT_BRANCH1}.*$'
    if [[ $branch =~ $BRANCH_REGEX ]] ; then
        export GIT_WORK_TREE=$GIT_TARGET1/.
        echo "Checking out branch: $branch";
        echo "Checking out to workdir: $GIT_WORK_TREE"; 

        # DEPLOY SOLUTION 2: 
        cd $GIT_DIR/; mkdir -p $GIT_TEMP_DIR1; 
        export GIT_WORK_TREE=$GIT_TEMP_DIR1/.
        git checkout -f $branch
        export GIT_WORK_TREE=$GIT_TARGET1/.
        rsync $GIT_TEMP_DIR1/. -v -q --delete --delete-after -av $GIT_TARGET1/.
        rm -rf $GIT_TEMP_DIR1
    fi

    BRANCH_REGEX='^${GIT_BRANCH2}.*$'
    if [[ $branch =~ $BRANCH_REGEX ]] ; then
        export GIT_WORK_TREE=$GIT_TARGET2/.
        echo "Checking out branch: $branch";
        echo "Checking out to workdir: $GIT_WORK_TREE"; 

        # DEPLOY SOLUTION 2: 
        cd $GIT_DIR/; mkdir -p $GIT_TEMP_DIR2; 
        export GIT_WORK_TREE=$GIT_TEMP_DIR2/.
        git checkout -f $branch
        export GIT_WORK_TREE=$GIT_TARGET2/.
        rsync $GIT_TEMP_DIR2/. -v -q --delete --delete-after -av $GIT_TARGET2/.
        rm -rf $GIT_TEMP_DIR2
    fi
done

दोनों समाधान इस धागे में उपलब्ध पहले के समाधानों पर आधारित हैं।

ध्यान दें, BRANCH_REGEX = '^ $ {GIT_BRANCH1}। "मास्टर " या "देव *" स्ट्रिंग से मेल खाने वाले शाखा नामों के लिए $ फ़िल्टर , और धक्का दिए गए मिलान से मेल खाने पर कार्य ट्री को तैनात करता है। यह एक देव संस्करण और मास्टर संस्करण को विभिन्न स्थानों पर तैनात करना संभव बनाता है।

DEPLOY SOLUTION 1 केवल उन्हीं फाइलों को हटाता है, जो रेपो का हिस्सा हैं, और एक कमिट द्वारा हटा दी गई थीं। यह परिनियोजन समाधान 2 से तेज है।

DEPLOY सॉल्यूशन 2 का फायदा यह है, कि यह किसी भी नई फाइल को प्रोडक्शन डायरेक्टरी से हटा देगा, जिसे सर्वर साइड में जोड़ा गया था, भले ही वह रेपो में जोड़ा गया हो या नहीं। यह हमेशा रेपो की सफाई की जाएगी। यह परिनियोजन समाधान 1 की तुलना में धीमा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.