গিট, নাগিওস এবং হুকস, গিট রেপো ক্ষতিগ্রস্থ হয়েছে


14

পটভূমি

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

আমি যে সাধারণ কর্মপ্রবাহটি প্রয়োগ করার চেষ্টা করছি তা হ'ল:

  1. নাগিওস কনফিগারেশনের স্থানীয় গিট রেপো সম্পাদনা করুন। সম্পাদিত ফাইল যুক্ত করুন, স্থানীয়ভাবে প্রতিশ্রুতিবদ্ধ।
  2. git push origin master রিমোট রেপো।
  3. পূশ-প্রাপ্ত হুক দ্বারা পুশকে বাধা দেওয়া হয়, যা ফাইলগুলি নিয়ে যায়, সেগুলি সার্ভারের অস্থায়ী ডিরেক্টরিতে নিয়ে যায় এবং সেগুলি নাগিও সিনট্যাক্স পরীক্ষকের মাধ্যমে চালায় runs
  4. সিনট্যাক্স চেকার যদি পাস হয়ে যায় তবে git pullপুশটি গ্রহণ করুন, তারপরে নতুন কোডে পোস্ট কমিট হুকটি লাইভ নাগিয়োগুলি কনফিগারেশন ডিরেক্টরিতে ব্যবহার করুন এবং তারপরে নাগিওগুলি পুনরায় চালু করুন।
  5. সিনট্যাক্স পরীক্ষক যদি ব্যর্থ হয় তবে নাগিও সিনট্যাক্স ত্রুটি ব্যবহারকারীর কাছে দেখিয়ে ধাক্কাটি প্রত্যাখ্যান করুন।

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

সমস্যা

আমি স্থানীয়ভাবে নাগিওস কনফিগারেশন সম্পাদনা করি, ইচ্ছাকৃতভাবে একটি সিনট্যাক্স ত্রুটি সহ, সংযুক্ত করি, এবং পরে স্থানীয়ভাবে প্রতিশ্রুতিবদ্ধ:

host:nagios erik$ vi nagios.cfg
host:nagios erik$ git add nagios.cfg
host:nagios erik$ git commit -m "syntax error"
[master da71aed] syntax error
 1 files changed, 1 insertions(+), 0 deletions(-)

এখন আমি সেই পরিবর্তনগুলি মাস্টার রেপোতে ঠেলাচ্ছি। সিনট্যাক্স ত্রুটির কারণে এটি প্রত্যাখাত হবে:

host:nagios erik$ git push origin master
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 12.74 KiB, done.
Total 3 (delta 1), reused 2 (delta 1)
remote: Previous HEAD position was 3ddc880... removed syntax error
remote: HEAD is now at da71aed... syntax error
remote: Nagios Config Check Exit Status: 254
remote: Your configs did not parse correctly, there was an error. Output follows.
remote:
remote: Nagios Core 3.2.3
remote: Copyright (c) 2009-2010 Nagios Core Development Team and Community Contributors
remote: Copyright (c) 1999-2009 Ethan Galstad
remote: Last Modified: 10-03-2010
remote: License: GPL
remote:
remote: Website: http://www.nagios.org
remote: Reading configuration data...
remote: Error in configuration file '/tmp/nagiosworkdir/nagios.cfg' - Line 23 (NULL value)
remote:    Error processing main config file!
remote:
remote:
remote:
remote: ***> One or more problems was encountered while processing the config files...
remote:
remote:      Check your configuration file(s) to ensure that they contain valid
remote:      directives and data defintions.  If you are upgrading from a previous
remote:      version of Nagios, you should be aware that some variables/definitions
remote:      may have been removed or modified in this version.  Make sure to read
remote:      the HTML documentation regarding the config files, as well as the
remote:      'Whats New' section to find out what has changed.
remote:
To git@remote-server.example.com:nagios
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@remote-server.example.com:nagios'

এটি দূরবর্তী রেপোটিকে স্পর্শ করা উচিত হয়নি, তবে এটি হয়েছিল। আমি যদি অন্য একটি স্থানীয় টেম্প ডিরেক্টরিতে পরিবর্তন করে এবং রেপো ক্লোন করার চেষ্টা করি তবে আমি পাই:

host:temp erik$ git clone git@remote-server.example.com:nagios
Cloning into nagios...
remote: Counting objects: 30, done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 30 (delta 12), reused 0 (delta 0)
Receiving objects: 100% (30/30), 29.81 KiB, done.
Resolving deltas: 100% (12/12), done.
error: Trying to write ref HEAD with nonexistant object da71aedfde2e0469288acd9e45bb8b57a6e5a7b3
fatal: Cannot update the ref 'HEAD'.

এখন আমি মূল কাজের ডিরেক্টরিতে ফিরে যাই, সিনট্যাক্স ত্রুটিটি ঠিক করি, যুক্ত, প্রতিশ্রুতিবদ্ধ এবং চাপ দিন:

host:nagios erik$ vi nagios.cfg
host:nagios erik$ git add nagios.cfg
host:nagios erik$ git commit -m "removing syntax error, push should succeed this time"
[master f147ded] removing syntax error, push should succeed this time
 1 files changed, 0 insertions(+), 2 deletions(-)
host:nagios erik$ git push origin master
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 487 bytes, done.
Total 4 (delta 2), reused 0 (delta 0)
remote: Previous HEAD position was 4c80d45... syntax error
remote: HEAD is now at f147ded... removing syntax error, push should succeed this time
remote: Nagios Config Check Exit Status: 0
remote: Your configs look good and parsed correctly.
To git@remote-server.example.com:nagios
   3ddc880..f147ded  master -> master

এই মুহুর্তে, সংগ্রহস্থলটি ভাল, এবং আমি একটি অস্থায়ী ডিরেক্টরিতে পরিবর্তন করতে এবং আবার রেপো ক্লোন করতে সক্ষম হয়েছি:

host:temp erik$ git clone git@remote-server.example.com:nagios
Cloning into nagios...
remote: Counting objects: 34, done.
remote: Compressing objects: 100% (33/33), done.
remote: Total 34 (delta 14), reused 0 (delta 0)
Receiving objects: 100% (34/34), 30.22 KiB, done.
Resolving deltas: 100% (14/14), done.

আমি ব্যবহার করছি প্রাক-প্রাপ্তি হুক এখানে ।

আমি ক্লায়েন্টে গিট v1.7.5.4 এবং সার্ভারে v1.7.2.3 ব্যবহার করছি।

সুতরাং, এই প্রশ্নটি : আমি পুশটি প্রত্যাখ্যান করার পরে কেন সংগ্রহস্থলটিকে বেমানান অবস্থায় রেখে দেওয়া হচ্ছে? আমার গিট হুকের সাথে কিছু খারাপ লাগছে বা সম্ভবত আমার গিটার বোঝার অভাব রয়েছে?


আপনি গিটের কোন সংস্করণ ব্যবহার করছেন?
রোবট

@robbyt - 1.7.5.4ক্লায়েন্টে, 1.7.2.3সার্ভারে।
EEAA

উত্তর:


7

আপনি করছেন:

export GIT_WORK_TREE=/tmp/nagiosworkdir
/usr/bin/git checkout -f $NEW_SHA1

আপনার হুক মধ্যে এটা আপনার স্বাভাবিক স্পর্শ না যদিও কাজের-অনুলিপি এটা করা হয় Git-Dir (বিশেষভাবে মধ্যে রেফারেন্স আপডেট HEAD, রেফারেন্স) হিসেবে আপনার ত্রুটি দেখানো:

...
remote: HEAD is now at da71aed... syntax error
...

আপনার হুক exit 1আপডেটটি প্রত্যাখ্যান করার জন্য করছে , তবে HEADব্যর্থতার পরে রেফারেন্সটি পুনরায় সেট করা এটি (পুনরায়) নয় ।

আমার মনে হয় আপনার নিজের হুকের ব্যর্থতা শাখাটি আপডেট করার দরকার আছে:

...
if [ "$NAGIOS_CHECK_STATUS" -ne 0 ]
   then
   echo "Your configs did not parse correctly, there was an error. Output follows."
   cat $GIT_WORK_TREE/check.out
   /usr/bin/git reset --hard $OLD_SHA1    # <-- Add This
   exit 1
else
   ...

এটি দুর্দান্ত লাগছে, ডাকগ্রাম ick আমি আজ একটু পরে এটি চেষ্টা করব। ধন্যবাদ!
EEAA

0

git checkoutআপনার হুক কমান্ড তৈরি করছে / আপনার সংগ্রহস্থলের মধ্যে মাথা সুত্র আপডেট।

যদি আপনার সংগ্রহশালাটি খালি সংগ্রহস্থল হয়, তবে এটি হেড রেফ ছাড়াই বাঁচতে পারে (নতুন ক্লোনগুলি তার মাস্টার শাখাটি পরীক্ষা করার জন্য ডিফল্ট হবে যদি এটি থাকে); প্রস্থান করার আগে কেবল হেড রেফটি মুছুন (সম্ভবত এটি trapযাতে আপনি প্রতিটি exitপৃথক পৃথকভাবে এটি করার ব্যবস্থা না করতে পারেন )। আপনার স্ক্রিপ্টের যে কোনও জায়গায় "প্রথম":

trap 'git update-ref -m "removing HEAD after temporary checkout to alternate workdir" -d HEAD "$NEW_SHA1"' 0

যদি আপনার সংগ্রহস্থলটি খালি না থাকে, বা আপনি একটি HEAD রেফারেন্স বজায় রাখতে চান (যাতে ক্লোনগুলি, ডিফল্টরূপে, অন্য কোনও শাখা পরীক্ষা করে দেখবে), তবে আপনাকে হেড রেফ সংরক্ষণ করতে হবে এবং প্রস্থান করার আগে এটি পুনরুদ্ধার করতে হবে।

প্রথমে সার্ভারের সংগ্রহস্থলে, নতুন ক্লোনগুলিতে আপনি ডিফল্টরূপে চেক আউট করতে চান সেই শাখার দিকে নির্দেশ করতে হেড রেফটিকে পুনরায় সেট করুন:

git symbolic-ref -m 'setting default branch for new clones' HEAD refs/heads/master

তারপরে, আপনার হুক স্ক্রিপ্টে (আপনার চেকআউটের আগে যে কোনও জায়গায়):

# Restore HEAD symref when exiting
saved_HEAD=$(git symbolic-ref HEAD)
trap 'git symbolic-ref -m "restoring HEAD after temporary checkout to alternate workdir" HEAD "$saved_HEAD"' 0

যাইহোক, pre-receiveহুকগুলি নিশ্চিত হওয়া উচিত যে তারা স্ট্যান্ডিন পুরোপুরি পড়েছে এবং যে সমস্ত লাইনে তারা খাওয়ানো হয় প্রক্রিয়া করে। সমস্ত ইনপুট গ্রাস করার আগে প্রস্থান করা কখনও কখনও git-receive-packপ্রক্রিয়াটিতে একটি সাইনপাইপ ট্রিগার করতে পারে; আপনি যদি একবারে কেবল একটি রেফ চাপেন (সম্ভবত আপনি কমপক্ষে একটি লাইন পড়েছেন) তবে এটি সম্ভবত আপনার ক্ষেত্রে আসে না তবে এটি মনে রাখা কিছু। সম্ভবত এই হুকটি হুক হিসাবে করা আরও সহজ updateযেখানে আপনাকে একবারে কেবল একটি রেফের সাথে সম্পর্কিত হতে হবে এবং প্রতিটি রেফের ধাক্কা স্বতন্ত্রভাবে প্রত্যাখ্যান করতে পারে (সম্ভবত আপনি কেবল মাস্টারটির ডগা "পরিষ্কার" রাখার বিষয়ে চিন্তা করছেন এবং যখন আপনি পরীক্ষা করছেন এবং অন্যান্য শাখার পরামর্শ সম্পর্কে রিপোর্ট করুন, তবে এগুলি কখনই প্রত্যাখ্যান করবেন না যাতে এগুলি অসম্পূর্ণ কাজে সহযোগিতার জন্য ব্যবহৃত হতে পারে)।

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