৮.৩ গিট কাস্টমাইজ করা গিট হুক্‌স

গিট হুক্‌স

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

হুক ইন্সটল পদ্ধতি

এই হুকগুলো গিট ডিরেক্টরির hooks সাবডিরেক্টরিতে স্টোর করা হয়। অধিকাংশ প্রজেক্টের ক্ষেত্রেই সেটা .git/hooks। যখন আপনি git init এর মাধ্যমে নতুন রিপজিটরি তৈরি করেন, গিট কিছু নমুনা স্ক্রিপ্টসহ হুক্‌স ডিরেক্টরিটি তৈরি করে দেয়, যেগুলো বেশ কার্যকর; আর স্ক্রিপ্টের ইনপুটগুলো কী হবে সেটাও নির্দিষ্ট করে দেয়। এই নমুনা স্ক্রিপ্টগুলো আসলে শেল স্ক্রিপ্ট, কিছু কিছু ক্ষেত্রে পার্ল স্ক্রিপ্ট। কিন্তু সঠিক নামসহ যেকোনো এক্সিকিউট্যাবল স্ক্রিপ্টই কাজ করবে- আপনি চাইলে রুবি, পাইথন কিংবা  আপনার পছন্দসই অন্য যে কোন ভাষায় সেগুলো লিখতে পারেন। আপনি যদি এই নমুনা স্ক্রিপ্টগুলো ব্যবহার করতে চান, তাহলে আপনাকে সেগুলোর নাম পরিবর্তন করতে হবে; সবগুলোর নামের শেষেই .sample আছে।

কোন হুক স্ক্রিপ্ট চালু করতে হলে, আপনার গিট ডিরেক্টরির hooks সাবডিরেক্টরিতে একটা নতুন ফাইল তৈরি করুন, যা সঠিকভাবে নামকরণ করা হয়েছে (কোন এক্সটেনশন ব্যাতিত) এবং যা এক্সিকিউট্যাবল। পরবর্তিতে সেখান থেকেই একে কল করতে হবে। আমরা এখানে অধিকাংশ মেজর হুকের উপর আলোকপাত করবো।

ক্লায়েন্ট-সাইড হুক্‌স

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

নোট

এটা মনে রাখা দরকার যে , যখন আপনি কোন রিপোজিটরি ক্লোন করেন, তখন ক্লায়েন্ট সাইড হুকগুলো কপি হয় না। আপনি যদি এ নিয়ে কোন পলিসি সেট করতে চান, তাহলে আপনাকে সেটা সার্ভার সাইডে করতে হবে;  গিট এনফোর্স পলিসি এই উদাহরণটি দেখুন।

 

কমিটিং-ওয়ার্কফ্লো হুক্‌স

প্রথম চারটি হুক কমিটিং প্রসেসের জন্য। 

 

সবার আগে pre-commit হুক শুরু হয়, এমনকি আপনি কমিট মেসেজ লেখার আগেই। আপনি যে স্নাপশটটি কমিট করতেছেন তা নিরীক্ষার জন্য, আপনি কিছু ভুলে গেলেন কিনা তা দেখার জন্য, টেস্ট সমূহ ঠিকঠাক চলছে কিনা নিশ্চিত করার জন্য কিংবা কোডের ভিতরে কোন কিছু চেক করার জন্য এটা দরকার হয়। এই হুক থেকে অশূন্য ফলাফল আসলে কমিট প্রসেস থেমে যায়, যদিও git commit –no-verify কমান্ড এর মাধ্যমে আপনি এটা এড়িয়ে যেতে পারবেন। আপনি কোড স্টাইল চেক করতে পারবেন (lint বা অনুরুপ অন্যকোন টুল), ট্রেইলিং হোয়াইট স্পেস চেক করতে পারবেন (ডিফল্ট হুক ঠিক এটাই করে) কিংবা নতুন মেথড সমূহের যথাযথ ডকুমেন্টেশন যাচাই করতে পারবেন। 

 

prepare-commit-msg এই হুকটি কমিট মেসেজ এডিটর শুরু হওয়ার আগে কিন্তু ডিফল্ট মেসেজ তৈরি হওয়ার আগে শুরু হয়। কমিট লেখক দেখার আগেই, এর মাধ্যমে আপনি ডিফল্ট মেসেজ এডিট করতে পারবেন।  এই হুকটি একাধিক প্যারামিটার গ্রহণ করে- যে ফাইলে কমিট মেসেজ আছে তার পাথ, কমিটের ধরণ এবং সংশোধিত কমিটের ক্ষেত্রে তার SHA-1। সাধারণ কমিটগুলোর জন্য এই হুকটি তেমন দরকারি নয়; বরং সেই কমিটগুলোর জন্য এটা দরকারি যার ডিফল্ট মেসেজটি অটো-জেনারেটেড, যেমন- টেমপ্লেটেড কমিট মেসেজ, মার্জ কমিট, স্কোয়াশড কমিট এবং সংশোধিত কমিট। প্রোগ্রাম্যাটিকভাবে তথ্য যোগ করার জন্য, যে কোন কমিট টেম্পলেটের সাথে আপনি এটা ব্যবহার করতে পারেন। 

 

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

 

কোন কমিট পুরোপুরি সম্পাদন হওয়ার পরে post-commit হুকটি চালু হয়। এটার কোন প্যারামিটার দরকার হয় না। কিন্তু git log -1 HEAD কমান্ড দিয়ে আপনি সর্বশেষ কমিটটি দেখতে পারবেন। সাধারণত এই স্ক্রিপ্টের মাধ্যমে কোন নোটিফিকেশন পাঠানো বা অনুরূপ কোন কাজ করা হয়। 

 
ইমেইল-ওয়ার্কফ্লো হুক

ইমেইল ওয়ার্কফ্লো এর জন্য আপনি তিনটি ক্লায়েন্ট সাইড হুক সেট করতে পারেন। আর এগুলো চালু হয়  git am কমান্ডের মাধ্যমে। আপনি যদি এই কমান্ডটি আপনার ওয়ার্কফ্লোতে ব্যবহার না করেন তাহলে আপনি পরের সেকশনে চলে যেতে পারেন।

 

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

 

git am দিয়ে প্যাচ প্রয়োগ করার জন্য পরবর্তী যে হুকটি চলে সেটা হলো pre-applypatch। কিছুটা বিভ্রান্তিকরভাবে, এটা কোন প্যাচ এপ্লাই করার _পরে_ কিন্তু কমিট করার আগে চলে। তাই কমিট করার আগে স্নাপশটটি যাচাই করার জন্য আপনি এটা ব্যবহার করতে পারেন। এই স্ক্রিপ্টের মাধ্যমে আপনি টেস্ট চালাতে পারবেন কিংবা ওয়ার্কিং ট্রি যাচাই করতে পারবেন। যদি কিছু মিস হয়ে থাকে বা টেস্ট পাস না করে, তাহলে অশূন্য ভ্যালুর মাধ্যমে প্যাচটি প্রয়োগ ছাড়াই git am স্ক্রিপ্টটি থেমে যায়। 

 

git am অপারেশনের শেষ হুকটি হচ্ছে post-applypatch, যা কমিটটি সম্পন্ন হওয়ার পর চালু হয়। আপনি যে প্যাচটি প্রয়োগ করেছেন তা কোন গ্রুপকে কিংবা এর লেখককে এই হুকের মাধ্যমে অবহিত করতে পারেন। এই স্ক্রিপ্টের মাধ্যমে আপনি প্যাচ প্রসেসটি প্রত্যাহার করতে পারবেন না। 

 
অন্যান্য ক্লায়েন্ট হুক

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

 

কোন কমিটকে রিপ্লেস করে এমন কমান্ড যেমন- git commit –amend কিংবা git rebase দিয়ে post-rewrite হুকটি চালু হয় (যদিও git filter-branch কমান্ড দিয়ে হয় না)। এটার একমাত্র আর্গুমেন্ট হলো যে কমান্ড দিয়ে পুনর্লিখন শুরু করা হয়। আর এটা বেশ কিছু stdin পুনর্লিখন গ্রহণ করে। 

 

post-checkout হুকটি চালু হয় যখনই কোন git checkout কমান্ড সফল হয়; এর মাধ্যমে আপনি আপনার প্রোজেক্ট এর জন্য ওয়ার্কিং ডিরেক্টরি সঠিকভাবে সেট করতে পারবেন। উদাহরণস্বরূপ- বড় কোন বাইনারি ফাইল যা আপনি সোর্স কন্ট্রোল করতে চান না তা সরাতে, ডকুমেন্টেশন অটো-জেনারেট করতে কিংবা তদ্রূপ অন্য কোন কাজ করতে এই হুকটি ব্যবহার করতে পারেন। 

 

যখনই কোন merge সফল হয়, post-merge হুকটি চালু হয়। যে কোন ডাটা, যা গিট ট্র্যাক করতে পারে না যেমন- পারমিশন ডাটা, ওয়ার্কিং ট্রিতে রিস্টোর করার জন্য এই হুকটি কাজে লাগে। একইভাবে, যখন ওয়ার্কিং ট্রি পরিবর্তন হয়, এই হুকটি গিট কন্ট্রোলের বাইরে এক্সটার্নাল ফাইলের উপস্থিতি যাচাই করতে পারে, যা হয়ত আপনি গিটে অন্তর্ভুক্ত করতে চান। 

 

git push চলাকালীন, রিমোট রেফারেন্স আপডেট করার পর কিন্তু কোন অবজেক্ট ট্রান্সফার করার আগে pre-push হুকটি চালু হয়। এটা প্যারামিটার হিসেবে রিমোটের নাম এবং লোকেশন আর stdin এর মাধ্যমে যে রেফারেন্সগুলো আপডেট হবে তার লিস্ট গ্রহণ করে। কোন পুশ সংঘটিত হওয়ার আগে, রেফারেন্স আপডেট গুলো যাচাই করতে আপনি এই হুকটি ব্যবহার করতে পারেন (অশূন্য এক্সিট কোড পুশ প্রক্রিয়াটি বাতিল করে)। 

 

git gc –auto এর মাধ্যমে গিট মাঝে মাঝে গারবেজ কালেকশন করে, যা এর স্বাভাবিক কর্মপ্রক্রিয়ার অংশ। pre-auto-gc হুকটি গারবেজ কালেকশনের ঠিক আগে চালু হয়, আর আপনাকে অবহিত করতে কিংবা সঠিক সময় না হলে গারবেজ কালেকশন বাতিল করতে এটা ব্যবহার করতে পারেন। 

 
সার্ভার সাইড হুক

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

 
pre-receive

ক্লায়েন্ট কোন পুশ করলে প্রথমেই pre-receive স্ক্রিপ্টটি চালু হয়। এটা stdin থেকে পুশ করা রেফারেন্সের লিস্টটি নেয়; যদি অশূন্য ভ্যালু দেয়, সেক্ষেত্রে সবগুলোই বাতিল হয়ে যায়। এই হুকটি দিয়ে নিশ্চিত করতে পারেন যে আপডেটেড রেফারেন্সগুলো নন-ফাস্ট-ফরোয়ার্ড কিংবা পুশে যে রেফারেন্স বা ফাইলগুলো আপডেট করা হচ্ছে সেগুলোর এক্সেস নিয়ন্ত্রণ করতে পারেন। 

 
update

update হুকটি pre-receive হুকের মতই , শুধু এটা পুশে আপডেট করা প্রত্যেকটি ব্রাঞ্চের জন্যই একবার করে এক্সিকিউট হয়। যদি একসাথে একাধিক ব্রাঞ্চে পুশ করা হয়, `প্রি-রিসিভ` হুকটি একবার চলে, কিন্তু আপডেট হুকটি প্রতিটি ব্রাঞ্চের জন্যই একবার করে চলবে। stdin থেকে নয় বরং এই হুকটি তিনটি আর্গুমেন্ট গ্রহণ করে- রেফারেন্স(ব্রাঞ্চ) এর নাম, পুশের আগের রেফারেন্সের SHA-1 আর পুশ এর SHA-1 ।  যদি স্ক্রিপ্টটি অশূন্য ভ্যালু দেয় সেক্ষেত্রে শুধু সেই রেফারেন্সটি বাতিল হয়, অন্য রেফারেন্সগুলো আপডেট হতে পারে। 

 
post-receive

পুরো পুশ প্রসেসটি শেষ হলে post-receive হুকটি শুরু হয়। এর মাধ্যমে অন্য সার্ভিস আপডেট করা যায় কিংবা ব্যবহারকারীদের অবহিত করা যায়। ইনপুট হিসেবে pre-receive হুকের মতই এটা একই stdin ডাটা নেয়। এর মাধ্যমে লিস্ট ইমেইল পাঠানো, কন্টিনিউয়াস ইন্টেগ্রেশন সার্ভার কে নোটিফাই করা, টিকেট-ট্রাকিং সিস্টেমে আপডেট করা যায় – এমনকি আপনি কমিট মেসেজগুলো পার্স করে কোন টিকেট খোলা, আপডেট করা বা বন্ধ করা হয়েছে কিনা সেটাও চেক করতে পারবেন। এই স্ক্রিপ্টটি পুশ প্রসেসকে থামাতে পারে না, কিন্তু এটা শেষ না হওয়া পর্যন্ত ক্লায়েন্ট ডিস্কানেক্টেড হয় না, তাই আপনি যদি কিছু করতে চান, একটু বেশিই সময় লাগতে পারে। 

টিপ

আপনি যদি কোন স্ক্রিপ্ট/হুক লিখেন যা অন্য ব্যবহারকারীরাও দেখবে, কমান্ড-লাইন ফ্ল্যাগের দির্ঘায়িত ভার্সন দিয়ে লেখার চেষ্টা করুন; ছয় মাস পর আপনি আমাদেরকেই ধন্যবাদ জানাবেন।