क्या किसी वेबसाइट का उपयोग करना संभव है git push
? मेरे पास एक कूबड़ है जो सर्वर साइड पर प्रदर्शन करने के लिए गिट हुक का उपयोग करने के साथ कुछ करना है git reset --hard
, लेकिन मैं इसे पूरा करने के बारे में कैसे जाऊंगा?
क्या किसी वेबसाइट का उपयोग करना संभव है git push
? मेरे पास एक कूबड़ है जो सर्वर साइड पर प्रदर्शन करने के लिए गिट हुक का उपयोग करने के साथ कुछ करना है git reset --hard
, लेकिन मैं इसे पूरा करने के बारे में कैसे जाऊंगा?
जवाबों:
मुझे इस साइट पर स्क्रिप्ट मिली और यह काफी अच्छी तरह से काम करती है।
अपनी स्थानीय प्रति पर, अपनी .it / config फ़ाइल को संशोधित करें और अपने वेब सर्वर को रिमोट के रूप में जोड़ें:
[remote "production"]
url = username@webserver:/path/to/htdocs/.git
सर्वर पर, .git / हुक / पोस्ट-अपडेट को इस फ़ाइल के साथ बदलें (नीचे दिए गए उत्तर में)
फ़ाइल तक पहुँच निष्पादित करें (फिर से, सर्वर पर):
chmod +x .git/hooks/post-update
अब, बस स्थानीय रूप से अपने वेब सर्वर पर धकेलें और इसे स्वचालित रूप से कार्य की प्रति अपडेट करनी चाहिए:
git push production
नीचे पोस्ट-अपडेट फ़ाइल का उपयोग करना :
अपनी स्थानीय प्रति पर, अपनी .it / config फ़ाइल को संशोधित करें और अपने वेब सर्वर को रिमोट के रूप में जोड़ें:
[remote "production"]
url = username@webserver:/path/to/htdocs/.git
सर्वर पर, नीचे फ़ाइल के साथ .git / हुक / पोस्ट-अपडेट बदलें
फ़ाइल तक पहुँच निष्पादित करें (फिर से, सर्वर पर):
chmod +x .git/hooks/post-update
अब, बस स्थानीय रूप से अपने वेब सर्वर पर धकेलें और इसे स्वचालित रूप से कार्य की प्रति अपडेट करनी चाहिए:
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
कई झूठी शुरुआत और मृत समाप्त होने के बाद, मैं अंत में इस लेख के लिए "गिट पुश रिमोट " के साथ वेबसाइट कोड को तैनात करने में सक्षम हूं ।
लेखक की पोस्ट-अपडेट स्क्रिप्ट केवल एक पंक्ति लंबी है और उसके समाधान के लिए .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 पुश विफल हो जाएगा। (यह शायद एक बग बग है)
किसी सर्वर पर गिट स्थापित न करें या .गित फ़ोल्डर की प्रतिलिपि बनाएँ। एक git क्लोन से एक सर्वर को अपडेट करने के लिए आप निम्नलिखित कमांड का उपयोग कर सकते हैं:
git ls-files -z | rsync --files-from - --copy-links -av0 . user@server.com:/var/www/project
आपको उन फ़ाइलों को हटाना पड़ सकता है जिन्हें परियोजना से हटा दिया गया था।
यह सभी जाँच की गई फ़ाइलों की प्रतिलिपि बनाता है। rsync ssh का उपयोग करता है जो किसी भी तरह सर्वर पर संस्थापित होता है।
कम सॉफ्टवेयर जो आपने सर्वर पर इंस्टॉल किया है वह उतना ही अधिक सुरक्षित है और इसे कॉन्फ़िगर करना और इसे प्रलेखित करना उतना ही आसान है। सर्वर पर एक पूर्ण git क्लोन रखने की भी आवश्यकता नहीं है। यह सब कुछ ठीक से सुरक्षित करने के लिए केवल अधिक जटिल बनाता है।
संक्षेप में आपको बस इतना करने की आवश्यकता है:
server = $1
branch = $2
git push $server $branch
ssh <username>@$server "cd /path/to/www; git pull"
मेरे पास मेरे आवेदन में उन पंक्तियों को एक निष्पादन योग्य कहा जाता है deploy
।
इसलिए जब मैं एक तैनाती करना चाहता हूं तो मैं टाइप करता हूं ./deploy myserver mybranch
।
ssh -A ...
git pull
स्वचालित तैनाती के लिए उपयोग से बचा जाना चाहिए क्योंकि इसके विलय वाले हिस्से को मैनुअल सफाई की आवश्यकता हो सकती है यदि कोई संघर्ष हो।
जिस तरह से मैं यह करता हूं वह मेरे तैनाती सर्वर पर एक नंगे गिट रिपॉजिटरी है जहां मैं परिवर्तन को धक्का देता हूं। तब मैं परिनियोजन सर्वर में प्रवेश करता हूं, वास्तविक वेब सर्वर डॉक्स निर्देशिका में परिवर्तन करता हूं, और एक गिट पुल करता हूं। मैं स्वचालित रूप से ऐसा करने की कोशिश करने के लिए किसी भी हुक का उपयोग नहीं करता हूं, जो कि इसके लायक होने की तुलना में अधिक परेशानी की तरह लगता है।
git reset
बीच वापस जाने के लिए उपयोग कर सकते हैं (सभी कमिट्स, न कि पूरे पुल)। यदि आपको कुछ विशिष्ट रोल करने की आवश्यकता है जो कि नवीनतम कमिट नहीं है, तो आप उपयोग कर सकते हैं, लेकिन इसका उपयोग शायद केवल आपात स्थितियों में किया जाना चाहिए ( एक नई प्रतिबद्ध बनाता है जो कुछ पिछले प्रतिबद्ध के प्रभाव को कम करता है)। git revert
git revert
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 घोषणा पर उल्लिखित निम्न कमियां हैं :
लेकिन वे सभी बिंदु Git के दायरे से बाहर हैं और बाहरी कोड द्वारा ध्यान रखा जाना चाहिए। तो इस अर्थ में, यह, गिट हुक के साथ मिलकर, अंतिम समाधान है।
अद्यतन: मैं अब प्रमुख एजेंट के साथ लॉयड मूर समाधान का उपयोग कर रहा हूं 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 वास्तविक वर्किंग डायरेक्टरी / पाथ / टू / प्रोजेक्ट के लिए अलग है)
हमारे परिदृश्य में हम github / bitbucket पर कोड स्टोर कर रहे हैं और लाइव सर्वर पर तैनात करना चाहते हैं। इस मामले में निम्नलिखित संयोजन हमारे लिए काम करता है (जो कि यहाँ अत्यधिक उत्कीर्ण उत्तरों का एक रीमिक्स है) :
.git
निर्देशिका को अपने वेब सर्वर पर कॉपी करेंgit remote add live ssh://user@host:port/folder
git config receive.denyCurrentBranch ignore
दूरस्थ पर: nano .git/hooks/post-receive
और यह सामग्री जोड़ें:
#!/bin/sh
GIT_WORK_TREE=/var/www/vhosts/example.org git checkout -f
रिमोट पर: chmod +x .git/hooks/post-receive
git push live
यदि आपका .git
फ़ोल्डर दस्तावेज़ रूट के भीतर है, तो सुनिश्चित करें कि आप इसे .htaccess
( स्रोत ) से जोड़कर बाहर से छिपाते हैं :
RedirectMatch 404 /\..*$
हम तैनाती को प्रबंधित करने के लिए कैपिस्ट्रानो का उपयोग करते हैं। हम एक स्टेजिंग सर्वर पर तैनात करने के लिए capistrano का निर्माण करते हैं, और फिर हमारे सभी सर्वर के साथ rsync चलाते हैं।
cap deploy
cap deploy:start_rsync (when the staging is ok)
कैपिस्ट्रानो के साथ, हम बग के मामले में आसान रोलबैक कर सकते हैं
cap deploy:rollback
cap deploy:start_rsync
Giddyup भाषा-अज्ञेयवादी हैं- add- git हुक के माध्यम से तैनाती को स्वचालित करने के लिए पानी जोड़ हुक। यह आपको वेब सर्वर को पुनरारंभ करने, कैश को गर्म करने आदि के लिए कस्टम स्टार्ट / स्टॉप हुक की भी अनुमति देता है।
https://github.com/mpalmer/giddyup
की जाँच करें उदाहरण ।
ऐसा लगता है जैसे आपके सर्वर पर दो प्रतियां होनी चाहिए। एक नंगी प्रति, जिसे आप धक्का दे सकते हैं / खींच सकते हैं, जो आपके द्वारा किए जाने पर आपके परिवर्तनों को धक्का देगा, और फिर आप इसे वेब निर्देशिका में क्लोन करेंगे और हर दिन अपनी वेब निर्देशिका से गिट पुल को अपडेट करने के लिए एक क्रोनजोब स्थापित करेंगे। इसलिए।
आप अनुमान लगा सकते हैं कि एक गिट हुक स्थापित किया गया है, जब कहते हैं कि "स्थिर" शाखा कहने के लिए बनाई गई है यह परिवर्तनों को खींच लेगा और उन्हें PHP साइट पर लागू करेगा। बड़ा नकारात्मक पक्ष यह है कि अगर कुछ गलत हो जाता है तो आपके पास बहुत अधिक नियंत्रण नहीं होगा और यह आपके परीक्षण के लिए समय जोड़ देगा - लेकिन आप यह जान सकते हैं कि जब आप अपनी ट्रंक शाखा को स्थिर शाखा में जानने के लिए कहते हैं तो आप कितने काम में शामिल होंगे। आप कितने संघर्षों में भाग सकते हैं। किसी भी फाइल पर नज़र रखना महत्वपूर्ण होगा जो साइट विशिष्ट हैं (उदाहरण के लिए। कॉन्फ़िगरेशन फ़ाइलें) जब तक आप केवल एक साइट को चलाने का इरादा नहीं रखते।
वैकल्पिक रूप से क्या आपने इसके स्थान पर साइट को बदलने पर जोर दिया है?
Git हुक की जानकारी के लिए githooks प्रलेखन देखें ।
मेरा ईसाई समाधान है।
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
मैं 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
git push web +master:refs/heads/master
सिर्फ के बजाय क्यों git push web master
?
पूरक उत्तर के रूप में मैं एक विकल्प की पेशकश करना चाहूंगा। मैं git-ftp का उपयोग कर रहा हूं और यह ठीक काम करता है।
https://github.com/git-ftp/git-ftp
उपयोग करने के लिए आसान, केवल प्रकार:
git ftp push
और git स्वचालित रूप से प्रोजेक्ट फ़ाइलों को अपलोड करेगा।
सादर
एक ऐसे वातावरण को देखते हुए जहाँ आपके पास कई डेवलपर्स एक ही रिपॉजिटरी तक पहुँचने के लिए निम्नलिखित दिशानिर्देशों की मदद कर सकते हैं।
सुनिश्चित करें कि आपके पास एक यूनिक्स समूह है जो सभी देवों का है और उस समूह के लिए .it रिपॉजिटरी का स्वामित्व देते हैं।
सर्वर रिपॉजिटरी के .git / config में शेयर्ड रिपॉजिटरी सेट = सही है। (यह कई उपयोगकर्ताओं को अनुमति देने के लिए गिट बताता है, जो कमिट और तैनाती के लिए आवश्यक है।
प्रत्येक उपयोगकर्ता के umask को उनके bashrc फ़ाइलों में समान होने के लिए सेट करें - 002 एक अच्छी शुरुआत है
मैंने अपना स्वयं का अल्पविकसित परिनियोजन टूल बनाया, जो स्वचालित रूप से रेपो से नए अपडेट को खींच लेगा - https://github.com/jesalg/SlimJim - मूल रूप से यह गिथब पोस्ट-हुक प्राप्त करने के लिए सुनता है और प्रॉक्सी को ट्रिगर करने के लिए प्रॉक्सी का उपयोग करता है अद्यतन स्क्रिप्ट।
पोस्ट-हुक के लिए मैं दो समाधानों का उपयोग करता हूं:
समाधान समाधान 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 की तुलना में धीमा है।