গিট পুশ ব্যবহার করে একটি প্রকল্প স্থাপন করুন


412

এটি ব্যবহার করে কোনও ওয়েবসাইট স্থাপন করা কি সম্ভব git push? আমি একটি দলা এটি ব্যবহার সঙ্গে কি কিছু আছে আছে Git আঙ্গুলসমূহ একটি সম্পাদনের জন্য git reset --hardসার্ভার প্রান্তের উপর, কিন্তু আমি এই পৌঁছনোর কিভাবে যেতে হবে?


2
আমি অনুমান করছি এটি কেবল তখনই প্রযোজ্য হবে যেখানে কেবলমাত্র একটি প্রোডাকশন সার্ভার রয়েছে, তাই না?
রিজক

6
@ রিজক ওয়েল, আপনি গিটের সাথে একসাথে একাধিক সার্ভারগুলিতে চাপ দিতে পারেন, তবে একবার আপনি যদি এই স্তরটিতে পৌঁছে যান তবে আপনি সম্ভবত এটির মতো হ্যাকের মতো নয় বরং একটি আসল সমাধান চাইবেন।
কাইল ক্রোনিন

আমার প্রকল্পগুলির সাথে ক্যাপিস্ট্রানো ব্যবহার করে আমি সাফল্য পেয়েছি, যদিও এটি মূলত রবি অন রেল অ্যাপ্লিকেশন স্থাপনার জন্য তৈরি করা হয়েছিল, পিএইচপি এবং অন্যান্য প্রকল্পগুলির সাথে ভাল কাজ করে।

উত্তরগুলি রুশ ভাষায় অনুবাদ করেছেন রু.সো: রু.স্ট্যাকওভারফ্লো
নিক ভলিনকিন

উত্তর:


287

আমি দেখেছি এই স্ক্রিপ্টের উপর এই সাইটের এবং বেশ ভাল এটা কাজ মনে হয়।

  1. আপনার .git ডিরেক্টরিতে আপনার ওয়েব সার্ভারে অনুলিপি করুন
  2. আপনার স্থানীয় অনুলিপিতে, আপনার .git / কনফিগারেশন ফাইলটি সংশোধন করুন এবং আপনার ওয়েব সার্ভারকে রিমোট হিসাবে যুক্ত করুন:

    [remote "production"]
        url = username@webserver:/path/to/htdocs/.git
    
  3. সার্ভারে, এই ফাইলটি দিয়ে .git / hooks / post-update প্রতিস্থাপন করুন (নীচের উত্তরে)

  4. ফাইলটিতে এক্সিকিউট এক্সেস যুক্ত করুন (আবার, সার্ভারে):

    chmod +x .git/hooks/post-update
    
  5. এখন, কেবলমাত্র স্থানীয়ভাবে আপনার ওয়েব সার্ভারে চাপ দিন এবং এটি স্বয়ংক্রিয়ভাবে কাজের অনুলিপিটি আপডেট করা উচিত:

    git push production
    

128
আপনার কাছে একটি .htaccess নীতি রয়েছে তা নিশ্চিত করুন যা .git ডিরেক্টরিটি পড়া থেকে রক্ষা করে। ইউআরএল ডাইভিংয়ের মতো এমন কারও কাছে যদি এটি অ্যাক্সেসযোগ্য হয় তবে পুরো উত্স কোড সহ একটি ফিল্ড ডে থাকতে পারে।
জেফ ফেরল্যান্ড 10'10

39
বিকল্পভাবে পাবলিক ডিরেক্টরিকে গিট রেপোর একটি উপ-ডিরেক্টরিতে পরিণত করুন। তারপরে আপনার কাছে ব্যক্তিগত ফাইল থাকতে পারে আপনি নিশ্চিত হন যে সর্বজনীন করা হবে না।
tlrobinson

3
এই লিঙ্কটি মারা গেছে। পোস্ট-আপডেট ফাইলের অন্য লিঙ্ক আছে?
রবার্ট হার্স্ট

6
হয়তো আমি কিছু অনুপস্থিত করছি কিন্তু আপনি আপনার উৎপাদন সার্ভার (গুলি) চাইবেন না টান একটি মাস্টার Git repositories producttion শাখা থেকে। আমার ধারণা, ওপিতে কেবল একটি সার্ভার রয়েছে? আমি সাধারণত আমার অবিচ্ছিন্ন ইন্টিগ্রেশন সার্ভারকে আমার সাইটের স্থাপনা করতে করি (মোতায়েনের আগে কিছু পরীক্ষা চালানো)।
অ্যাডাম জেন্ট

4
ইতিমধ্যে কমিটসগুলির ক্রম রয়েছে এমন একটি সংগ্রহশালা থেকে এই পদক্ষেপগুলি অনুসরণ করা; প্রথমে আপনি চাপ দিতে পারবেন না কারণ মাস্টার শাখা ইতিমধ্যে চেক আউট হয়ে গেছে। তারপরে আপনি যদি রিমোটের একটি বিকল্প শাখা চেকআউট করেন তবে কেবলমাত্র ভিন্ন ফাইলগুলি কার্যকরী ডিরেক্টরিতে পরীক্ষা করে দেখানো হয়। আমি প্রত্যাশিত
হুকটি

80

নীচে পোস্ট-আপডেট ফাইল ব্যবহার :

  1. আপনার .git ডিরেক্টরিতে আপনার ওয়েব সার্ভারে অনুলিপি করুন
  2. আপনার স্থানীয় অনুলিপিতে, আপনার .git / কনফিগারেশন ফাইলটি সংশোধন করুন এবং আপনার ওয়েব সার্ভারকে রিমোট হিসাবে যুক্ত করুন:

    [remote "production"]
        url = username@webserver:/path/to/htdocs/.git
    
  3. সার্ভারে, নীচের ফাইলের সাথে .git / hooks / পোস্ট-আপডেট প্রতিস্থাপন করুন

  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
গীজ ... আপনি পিএইচপি, পাইথন, গ্রোভি বা অন্য যে কোনও কিছু বিকাশের জন্য বিকাশের জন্য এই ভাষাটি লিখুন! আমি শেল স্ক্রিপ্টগুলির জন্য এই ভালবাসাটি কখনই বুঝতে পারি নি (যা বিষয়গতভাবে) বেশ বিজোড় সিনট্যাক্স এবং খুব কম কার্যকরী বৈশিষ্ট্যযুক্ত।
dVaffication

4
@dVaffication আপনি যে কোনও ক্ষেত্রে শিট কমান্ড লিখতে যাচ্ছেন যদি আপনি গিট ব্যবহার করছেন। সুতরাং অন্য ভাষায় স্ক্রিপ্ট লেখার পরিবর্তে এবং সেই ভাষা এবং শেলের মধ্যে ক্রমাগত জাগ্রত করুন। শেল এ সব লেখা যৌক্তিক বলে মনে হচ্ছে আপনি কি ভাবেন না?
আবদাররহমানে তাহরি জুটি

সার্ভারেও আমাকে 'গিট কনফিগার রিসিভ.ডেনইক্রেনারবাং আপডেট আপডেটস্ট্যান্ড' করতে হয়েছিল, যাতে এটি ধাক্কা গ্রহণ করে। আমার মনে হয় এর কারণ শাখাটি চেক আউট হয়েছিল?
স্ট্যাকপুশার

60

অনেকগুলি ভুয়া শুরু এবং শেষের পরে, আমি এই নিবন্ধটির জন্য কেবল "গিট পুশ রিমোট " ধন্যবাদ দিয়ে ওয়েবসাইট কোড স্থাপন করতে সক্ষম হয়েছি ।

লেখকের আপডেট-পরবর্তী স্ক্রিপ্টটি কেবল একটি লাইন দীর্ঘ এবং তার সমাধানের জন্য গিট রেপোকে অন্য কেউ যেমন লুকানোর জন্য .htaccess কনফিগারেশন প্রয়োজন হয় না।

আপনি যদি এটি একটি অ্যামাজন ইসি 2 উদাহরণে স্থাপন করছেন তবে কয়েকটি হোঁচট খাচ্ছে;

1) আপনি যদি খালি গন্তব্য সংগ্রহস্থল তৈরি করতে sudo ব্যবহার করেন তবে আপনাকে রেপোর মালিককে AC2-ব্যবহারকারীতে পরিবর্তন করতে হবে অথবা পুশ ব্যর্থ হবে। ("ক্লাউন ইক 2 ব্যবহারকারী: ইক 2-ব্যবহারকারী রেপো " চেষ্টা করুন)

2) আপনি যদি আপনার অ্যামাজন-প্রাইভেট-কী .pem এর অবস্থানটি পূর্বে কনফিগার না করে থাকেন তবে এই ধাক্কাটি ব্যর্থ হবে etc হোস্ট] - হোস্টনাম - আইডেন্টিটি ফাইল - ব্যবহারকারী "লেআউটটি এখানে বর্ণিত ...

... তবুও যদি হোস্টটি ~ / .ssh / config এ কনফিগার করা থাকে এবং হোস্টনামের চেয়ে পৃথক হয় তবে গিট পুশ ব্যর্থ হবে। (এটি সম্ভবত গিট বাগ)


আপনি উল্লিখিত নিবন্ধের পদক্ষেপগুলি আমি অনুসরণ করেছি এবং সমস্ত কিছুই কবজির মতো কাজ করেছে। সুরক্ষা বা স্থিতিশীলতা সম্পর্কিত কিছু ত্রুটি রয়েছে বলে আমি কেবল আশ্চর্য হই। এ বিষয়ে কোন পরামর্শ?
xlttj

এক্সএল-টি: ধরে নিই আপনি এসএসএইচ-এর উপর গিট ব্যবহার করছেন আমি বলব গিটের সাথে ভুল করার ক্ষেত্রে বিপদ রয়েছে। আপনি নিবন্ধটির লেখককে জিজ্ঞাসা করতে পারেন; তিনি এটিকে "প্রশ্ন এবং পরামর্শ স্বাগত জানাই" দিয়ে শেষ করেন। আমার বর্তমান (মস্তিষ্ক-মৃত) প্রতিরূপ কৌশল প্যানিক সফ্টওয়্যার দ্বারা ট্রান্সমিট ব্যবহার করা use
আর্ল জেড

1
লিঙ্কিত নিবন্ধটির একটি গুরুত্বপূর্ণ প্রয়োজনীয়তা রয়েছে যখন আপনি হুক ব্যবহার করেন। হিটগুলি ব্যর্থ হবে যদি .git একই নামকরণ স্কিমটিতে কার্যকারী ডিরেক্টরি হিসাবে উপস্থিত হয়। অর্থাত্ / foo / বার (কর্মনির্দেশক ডিরেক্টরি) এবং /foo/bar.git (ব্রেডবোন গিট সংগ্রহস্থল)। সুতরাং নিশ্চিত হয়ে নিন যে আপনি / foo / বারের অন্য কোনও নামকরণ করেছেন, যেমন /foo/bar.live বা / foo / blah ভাল, আপনি যদি ভাবছেন, আপনার কর্ম ডিরেক্টরিতে যদি একই নাম রয়েছে তবে সঠিক ত্রুটি বার্তাটি আপনি পাবেন বেয়ারবোন সংগ্রহস্থলটি হ'ল "রিমোট: মারাত্মক: মূল সিডব্লিউডে ফিরে যেতে পারেনি: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই"
অ্যান্টনি

1
চালানোর জন্য আপনার পোস্ট-ডিপ্লোয়ি হুকের প্রয়োজন কেন আমি তা অনুসরণ করি না। কোড পরিবর্তনগুলি দূরবর্তী রেপোতে ঠেলাঠেলি মানে দূরবর্তী রেপো আপ টু ডেট। আমি কী মিস করছি?
চার্লি শ্লিয়েসার

1
@ চার্লি আপনি যা হারিয়েছেন তা হ'ল এই গিটটি আপনাকে কোনও শাখাকে কোনও ভাণ্ডারটিতে ঠেলে দিতে দেবে না যাতে সেই শাখাটি চেক আউট হয়ে গেছে। এক্ষেত্রে, (আইএমএইচও খুব সুন্দর) উত্তরটিতে দুটি সংগ্রহস্থল থাকতে হবে: আপনার কাছে চাপানো একটি খালি রেপো এবং দ্বিতীয় রেপো যার খালি রেপোটিতে চাপ দেওয়া হলে হুকের সাহায্যে আপডেট করা হয় working
বেন হিউজেস

21

সার্ভারে গিট ইনস্টল করবেন না বা সেখানে .git ফোল্ডারটি অনুলিপি করুন। গিট ক্লোন থেকে সার্ভার আপডেট করতে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

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

আপনাকে প্রকল্প থেকে সরানো ফাইলগুলি মুছতে হবে।

এটি সমস্ত পরীক্ষিত ফাইলগুলিকে অনুলিপি করে। rsync ssh ব্যবহার করে যা সার্ভারে যাইহোক ইনস্টল করা আছে।

আপনি সার্ভারে যত কম সফ্টওয়্যার ইনস্টল করেছেন তিনি তত বেশি সুরক্ষিত এবং এর কনফিগারেশনটি পরিচালনা করতে এবং এটি নথিভুক্ত করা সহজ। সার্ভারে একটি সম্পূর্ণ গিট ক্লোন রাখার দরকার নেই। এটি কেবল সবকিছু যথাযথভাবে সুরক্ষিত করা আরও জটিল করে তোলে।


3
একটি সতর্কতা: এটি আপনার কার্যনির্বাহী ডিরেক্টরিতে থাকা ফাইলগুলিকে আরএসএনসি করবে। আমি মনে করি এটি কোনও স্ক্রিপ্ট ব্যবহার করে এড়ানো যায় যা বর্তমান পরিবর্তনগুলিকে স্ট্যাশ করে, সবকিছু পরিষ্কার করে, মোতায়েন করে এবং তারপরে স্ট্যাশকে ফিরিয়ে দেয়।
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 -A ...
কারসেল

1
আপনি যদি এসএসএইচ কী স্থাপনের জন্য কোনও গাইড অন্তর্ভুক্ত করেন তবে এটি আরও সহজ হবে যা এই উত্তরটি 'নির্বিঘ্নে' কাজ করতে নির্ভর করে
হেনজি

git pullস্বয়ংক্রিয় মোতায়েনের জন্য ব্যবহার এড়ানো উচিত কারণ এর কোনও সংশ্লেষের অংশটি ম্যানুয়াল ক্লিনআপের প্রয়োজন হতে পারে যদি কোনও বিরোধ থাকে conflic
কুইন কমেন্ডেন্ট

9

আমি যেভাবে এটি করি তা হ'ল আমার ডিপ্লোয়মেন্ট সার্ভারে আমি খালি গিট সংগ্রহস্থল রাখি যেখানে আমি পরিবর্তনগুলিকে ধাক্কা দিয়ে থাকি। তারপরে আমি ডিপ্লোয়মেন্ট সার্ভারে লগইন করি, প্রকৃত ওয়েব সার্ভার ডক্স ডিরেক্টরিতে পরিবর্তন করি এবং গিট টান করি। এটি স্বয়ংক্রিয়ভাবে করার চেষ্টা করার জন্য আমি কোনও হুক ব্যবহার করি না, এটি মনে হয় এটির চেয়ে মূল্য বেশি কষ্টের।


নতুন কোডে ত্রুটি (গুলি) এর ক্ষেত্রে, আপনি কি প্রতি প্রতিশ্রুতি পুনরায় সেট করবেন বা পুরো টানছেন? (বা কেবলমাত্র 1 টি সম্ভব?)
রুডি

1
@ রুডি: যদি আপনাকে ডিপ্লোয়মেন্ট সার্ভারে পরিবর্তনগুলি রোল করতে হয় তবে আপনি সর্বশেষ পরিবর্তনগুলির git resetমধ্যে ফিরে যেতে ব্যবহার করতে পারেন (সমস্ত প্রতিশ্রুতি, কেবল পুরো টান নয়)। আপনার যদি সুনির্দিষ্ট কোনও কিছু রোল করতে হয় যা সর্বশেষ প্রতিশ্রুতি নয়, তবে আপনি ব্যবহার করতে পারেন তবে এটি সম্ভবত জরুরী পরিস্থিতিতে ব্যবহার করা উচিত ( একটি নতুন প্রতিশ্রুতি তৈরি করে যা কিছু পূর্ববর্তী প্রতিশ্রুতির প্রভাবকে অগ্রাহ্য করে)। git revertgit revert
গ্রেগ হিউগিল

কৌতূহলের বাইরে: আপনি কেন ভাবেন যে হুকগুলি এর জন্য মূল্যমানের চেয়ে বেশি সমস্যা হবে?
রিজক

@ রিজক: এর জন্য হুক ব্যবহার করার সময়, আসল ওয়েব সার্ভার ডক্স ডিরেক্টরিটি একটি স্বয়ংক্রিয় পটভূমি প্রক্রিয়া দ্বারা পরিবর্তিত হয়। লগ ইন করতে ডক্স ডিরেক্টরিতে পরিবর্তনগুলি প্রয়োগ করা হয় ঠিক তখনই আমাকে আরও নিয়ন্ত্রণ করতে দেয়। এছাড়াও, যখন জিনিসগুলি ভুল হয়ে যায় তখন এটি ঠিক করা আরও সহজ। হুকগুলি আরও উপযুক্ত হতে পারে যদি প্রতিবেদকদের ওয়েব সার্ভারে লগ ইন করার পর্যাপ্ত অ্যাক্সেস না থাকে।
গ্রেগ হিউগিল

সুতরাং আপনার আসল ওয়েব অ্যাপ ফোল্ডারটিও একটি .git সংগ্রহস্থল? .Git ফোল্ডারটি কী, এটি বাইরের বিশ্বের কাছে দৃশ্যমান?
ফার্নান্দো

9

git config --local receive.denyCurrentBranch updateInstead

গিট ২.৩-এ যুক্ত হয়েছে, এটি একটি ভাল সম্ভাবনা হতে পারে: https://github.com/git/git/blob/v2.3.0/ ডকুমেন্টেশন / কনফিগ.txt#L2155

আপনি এটি সার্ভার ভান্ডারটিতে সেট করেছেন এবং এটি কার্যকরী ট্রিটি পরিষ্কার থাকলে আপডেটও করে।

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

গিটহাব ঘোষণায় এটিতে নিম্নোক্ত ত্রুটিগুলি রয়েছে :

  • আপনার সার্ভারে আপনার প্রকল্পের পুরো ইতিহাস সমেত একটি .git ডিরেক্টরি থাকবে। আপনি সম্ভবত অতিরিক্ত নিশ্চিত করতে চান যে এটি ব্যবহারকারীর কাছে সরবরাহ করা যায় না!
  • মোতায়েনের সময় ব্যবহারকারীরা পুরানো সংস্করণে কিছু ফাইল এবং অন্যদের নতুন সংস্করণে, এমনকি অর্ধ-লিখিত ফাইল এমনকি ক্ষণে ক্ষণে অসঙ্গত অবস্থায় সাইটটির মুখোমুখি হওয়া সম্ভব হবে। এটি যদি আপনার প্রকল্পের জন্য সমস্যা হয় তবে દબાણ-থেকে-মোতায়েন করা সম্ভবত আপনার পক্ষে নয়।
  • যদি আপনার প্রকল্পের কোনও "বিল্ড" পদক্ষেপের প্রয়োজন হয়, তবে আপনাকে সম্ভবত এটি গিথুকের মাধ্যমে স্পষ্ট করে সেট আপ করতে হবে।

তবে এই সমস্ত পয়েন্টগুলি গিতের বাইরে নয় এবং অবশ্যই বাহ্যিক কোডের দ্বারা যত্ন নেওয়া উচিত। সুতরাং সেই অর্থে, এটি, গিট হুকের সাথে একত্রে চূড়ান্ত সমাধান।


এটি সেট করতে, এই কমান্ডটি চালান: টার্মিনালে 'গিট কনফিগারড রিসিভ। এডিয়ানক্রেনার ব্র্যাঙ্ক আপডেট ইনস্ট্যান্ড'
স্ট্যাকপুশার

5

আপডেট: আমি এখন কী এজেন্টের সাথে লয়েড মুর সলিউশনটি ব্যবহার করছি ssh -A ...। একটি প্রধান রেপোতে ধাক্কা দেওয়া এবং তারপরে আপনার সমস্ত মেশিনের সাথে সমান্তরালে এটিকে আঁকানো কিছুটা দ্রুত এবং সেই সমস্ত মেশিনগুলিতে কম সেটআপের প্রয়োজন।


এই সমাধানটি এখানে দেখছেন না। সার্ভারে গিট ইনস্টল করা থাকলে কেবল এসএসএসের মাধ্যমে চাপ দিন।

আপনার স্থানীয় .git / কনফিগারেশনে আপনাকে নীচের প্রবেশের প্রয়োজন হবে

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

তবে আরে, ওটা কি amazon:? আপনার স্থানীয় ~ / .ssh / কনফিগারেশনে আপনাকে নিম্নলিখিত এন্ট্রি যুক্ত করতে হবে:

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'

(বিটিডাব্লু: /পাথ / টো / প্রজেক্ট.git প্রকৃত কার্যকারী ডিরেক্টরি / পথ / থেকে / প্রকল্পের চেয়ে পৃথক)


5

স্থাপনার পরিস্থিতি জন্য

আমাদের দৃশ্যে আমরা গিথুব / বিটবাকেটে কোডটি সংরক্ষণ করছি এবং লাইভ সার্ভারগুলিতে স্থাপন করতে চাই। এক্ষেত্রে নিম্নলিখিত সংমিশ্রণটি আমাদের জন্য কাজ করে (এটি এখানে উচ্চ upvated উত্তরের একটি রিমিক্স) :

  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

মন্তব্য

  • এই সমাধানটি পুরানো গিট সংস্করণগুলির সাথে কাজ করে (1.7 এবং 1.9 দিয়ে পরীক্ষিত)
  • আপনাকে প্রথমে গিথুব / বিটবাকেটে ঠেলাঠেলি নিশ্চিত করতে হবে, তাই আপনার লাইভে একটি ধারাবাহিক রেপো থাকবে
  • যদি আপনার .gitফোল্ডারটি নথির মূলের মধ্যে থাকে তবে নিশ্চিত করুন যে আপনি এটিকে .htaccess( উত্স ) যোগ করে বাইরে থেকে আড়াল করেছেন :

    RedirectMatch 404 /\..*$


4

মোতায়েন পরিচালনার জন্য আমরা ক্যাপিস্ট্রানো ব্যবহার করি । আমরা একটি মঞ্চ সার্ভারে স্থাপন করতে ক্যাপিস্ট্রানো তৈরি করি এবং তারপরে আমাদের সার্ভারের সাথে একটি আরএসসিএনসি চালাচ্ছি।

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

ক্যাপিস্ট্রানো দিয়ে আমরা বাগের ক্ষেত্রে সহজ রোলব্যাক করতে পারি

cap deploy:rollback
cap deploy:start_rsync

আপনি কাস্টিস্ট্রোরোতে আরএসসিএন এর মাধ্যমে সরাসরি স্থাপনাকে একীভূত করেছেন?
মার্টিন আব্রাহাম

2

গিডিপ হ'ল ভাষা- অজ্ঞাতনামা কেবলমাত্র জল-যোগ মাধ্যমে মোতায়েন স্বয়ংক্রিয় গিট হুক। এটি আপনাকে ওয়েব সার্ভার পুনরায় চালু করতে, ক্যাশে উষ্ণ করার জন্য কাস্টম স্টার্ট / স্টপ হুক রাখার অনুমতি দেয়

https://github.com/mpalmer/giddyup

পরীক্ষা করে দেখুন উদাহরণ


1

আপনার সার্ভারে দুটি কপি থাকা উচিত বলে মনে হচ্ছে। একটি খালি অনুলিপি, আপনি এটি থেকে ধাক্কা / টানতে পারবেন, যা আপনার কাজগুলি হয়ে যাওয়ার পরে আপনার পরিবর্তনগুলিকে ধাক্কা দেবে এবং তারপরে আপনি এটি ওয়েব ডিরেক্টরিতে ক্লোন করবেন এবং প্রতিদিন আপনার ওয়েব ডিরেক্টরি থেকে গিট পুল আপডেট করার জন্য একটি ক্রোনজ সেট আপ করবেন বা তাই।


1

আপনি সম্ভবত একটি গিট হুক সেট আপ করতে পারেন যে যখন "স্থিতিশীল" শাখাটি বলার জন্য কোনও কমিট করা হয় তা পরিবর্তনগুলি টানবে এবং সেগুলি পিএইচপি সাইটে প্রয়োগ করবে। বড় খারাপ দিকটি হ'ল কিছু ভুল হয়ে গেলে আপনার খুব বেশি নিয়ন্ত্রণ থাকবে না এবং এটি আপনার পরীক্ষায় সময় যোগ করবে - তবে আপনি নিজের ট্রাঙ্কটি শাখাকে স্থিতিশীল শাখায় মার্জ করার সময় কতটা কাজ জড়িত তা সম্পর্কে ধারণা পেতে পারেন know আপনি কতগুলি দ্বন্দ্বের মধ্যে পড়তে পারেন । আপনি কেবলমাত্র একটি সাইট চালানোর ইচ্ছা না রাখলে সাইট সুনির্দিষ্ট যে কোনও ফাইলের (যেমন, কনফিগারেশন ফাইলগুলি) নজরে রাখা গুরুত্বপূর্ণ হবে।

বিকল্পভাবে আপনি পরিবর্তে সাইটে পরিবর্তনের দিকে তাকিয়েছেন?

গিট হুক সম্পর্কিত তথ্যের জন্য গিথুকস ডকুমেন্টেশন দেখুন।


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 সার্ভারে পরিবর্তন
  • অস্থায়ী ফোল্ডার থেকে ডিয়ার মোতায়েন করুন।

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


এইভাবে সংগ্রহস্থলে বিদ্যমান ফাইলগুলি মুছবেন না।
RusAlex

2
কেন কেবল ন্যায়বিচারের git push web +master:refs/heads/masterপরিবর্তে git push web master?
ম্যাথিউ ময়

1

পরিপূরক উত্তর হিসাবে আমি একটি বিকল্প প্রস্তাব করতে চাই। আমি গিট-এফটিপি ব্যবহার করছি এবং এটি ভাল কাজ করে।

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

ব্যবহারে সহজ, কেবল টাইপ করুন:

git ftp push

এবং গিটটি স্বয়ংক্রিয়ভাবে প্রকল্প ফাইলগুলি আপলোড করবে।

শুভেচ্ছা সহ


0

এমন এক পরিবেশ দেওয়া হয়েছে যেখানে আপনার একাধিক বিকাশকারী একই সংগ্রহস্থলটিতে অ্যাক্সেস করে নীচের নির্দেশিকাগুলি সহায়তা করতে পারে।

আপনার কাছে এমন একটি ইউনিক্স গোষ্ঠী রয়েছে তা নিশ্চিত করুন যে সমস্ত দেবগণ অন্তর্ভুক্ত রয়েছে এবং সেই গোষ্ঠীর .git সংগ্রহস্থলের মালিকানা দেয় give

  1. সার্ভারের সংগ্রহস্থলের .git / কনফিগারেশনে শেয়ারডেপোসিটিরি = সত্য। (এটি কমিট এবং মোতায়েনের জন্য প্রয়োজনীয় একাধিক ব্যবহারকারীকে অনুমতি দেওয়ার জন্য গিটকে বলে।

  2. প্রতিটি বাশার্ক ফাইলগুলিতে প্রতিটি ব্যবহারকারীর উমাস্ক সেট করুন - 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}} 'মাস্টার ' বা "দেব *" স্ট্রিংয়ের সাথে মিলে যাওয়া শাখার নামগুলির জন্য fil 'ফিল্টারগুলি , এবং যদি ধাক্কা দেওয়া শাখাটি মেলে তবে কার্য গাছ স্থাপন করে। এটি বিভিন্ন জায়গায় ডেভ সংস্করণ এবং মাস্টার সংস্করণ স্থাপন করা সম্ভব করে তোলে।

ডিপলাই সলিউশন 1 কেবলমাত্র ফাইলগুলিকে সরায়, যা রেপুর অংশ, এবং প্রতিশ্রুতি দ্বারা সরানো হয়েছিল। এটি ডিপ্লোয়মেন্ট সলিউশন 2 এর চেয়ে দ্রুত।

ডিপলাই সলিউশন 2 এর সুবিধা রয়েছে যে এটি সার্ভার সাইডে যুক্ত হওয়া প্রযোজনা ডিরেক্টরি থেকে যে কোনও নতুন ফাইল সরিয়ে ফেলবে, এটি রেপোতে যুক্ত হয়েছিল কিনা তা বিবেচনা করেই নয়। এটি সর্বদা রেপোর ক্লিন ডুপেই থাকবে। এটি ডিপ্লোয়মেন্ট সলিউশন 1 এর চেয়ে ধীর।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.