একটি নির্দিষ্ট শাখা নিয়ে কাজ করার জন্য গিট পোস্ট-রিসিভ হুক লেখা


107

এখানে আমার বর্তমান হুকটি একটি খালি রেপো যা কোম্পানির সার্ভারে বাস করে: git push origin master এই হুকটি এসেম্বলায় ঠেলাঠেলি করে। আমার প্রয়োজন কেবলমাত্র একটি শাখা (মাস্টার, আদর্শ) ধাক্কা দেওয়া যখন কেউ আমাদের সার্ভারে সেই শাখায় পরিবর্তনের চাপ দেয় এবং অন্য শাখাগুলিতে ঠেলাঠেলি উপেক্ষা করে। খালি রেপো থেকে শাখাটি নির্বাচন করা এবং কেবল সেই শাখাটি অ্যাসেমব্লায় চাপানো কি সম্ভব?


আপনি কি বোঝাতে চেয়েছেন? git push origin masterকেবল masterশাখাটি originদূরবর্তী স্থানে ঠেলে দেবে , যা আমি ধরে নিই যে এসেম্বলা হিসাবে সংজ্ঞায়িত করা হয়েছে। আপনি কি বলছেন যে আপনি কেবল তখনই হুককে ট্রিগার করতে হবে যখন কেউ তার masterবিপরীতে feature1, বা এর মতো কিছুতে ধাক্কা দেয় ?
স্টিফান কেন্ডাল

পছন্দ করেছেন শব্দটি আমি পাইনি, হি।
জর্জি গুবার্টে

উত্তর:


386

পোস্ট-রিসিভ হুক স্ট্যান্ডিনের কাছ থেকে তার আর্গুমেন্টগুলি আকারে পেয়ে যায় <oldrev> <newrev> <refname>। যেহেতু এই যুক্তিগুলি স্ট্যান্ডিন থেকে আসছে, কোনও কমান্ড লাইন আর্গুমেন্ট থেকে নয়, readপরিবর্তে আপনাকে ব্যবহার করা দরকার $1 $2 $3

পোস্ট-রিসিভ হুক একবারে একাধিক শাখা গ্রহণ করতে পারে (উদাহরণস্বরূপ কেউ যদি এটি করেন git push --all), সুতরাং আমাদেরও readএকটি whileলুপে মোড়ানো দরকার rap

একটি কাজের স্নিপেট দেখতে এরকম কিছু দেখায়:

#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ "master" = "$branch" ]; then
        # Do something
    fi
done

2
"==" আমার পক্ষে কাজ করে না। একক সাথে "=" আমার পক্ষে ভাল কাজ করে।
রায়

1
একটি পুরানো থ্রেড আনার জন্য দুঃখিত, তবে আমি যদি বিবৃতিতে একটি ত্রুটি পাচ্ছি। মারাত্মক: দূরবর্তী প্রান্তটি অপ্রত্যাশিতভাবে স্তব্ধ হয়ে গেল। ত্রুটি: সাইডব্যান্ড ডেমোলেটিপ্লেজারে ত্রুটি। এটি if স্টেটমেন্টের বাইরে $ শাখা প্রতিধ্বনিত করবে।
gin93r

5
@ রে, এর #!/bin/shপরিবর্তে আপনার কি আছে #!/bin/bash?
শাটল 87

2
আমি যে ঝুঁকি নিয়ে ভাবতে পারি তা হ'ল ট্যাগ হবে, যেহেতু তাদের নামগুলি শাখার নামের সাথে ওভারল্যাপ হতে পারে। আপনি যদি refs/heads/masterতার পরিবর্তে সন্ধান করেন refs/tags/masterতবে ঠিক হবে। এর মতো অন্য প্রান্তের কেস থাকতে পারে আমি যদিও ভাবতে পারি না। এটি নিজের ডানদিকে একটি ভাল স্ট্যাকওভারফ্লো প্রশ্ন হতে পারে।
পলজজ

1
@ পলজজ আমি এমন ব্যবহার করি if branch=$(git rev-parse --symbolic --abbrev-ref $refname 2>/dev/null); thenযাতে কোনও শাখা অপসারণ করার পরে গিটটি অভিযোগ না করে।
জের্মেমে

8

স্টিডিনে পোস্ট-রিসিভ হুকের সর্বশেষ প্যারামিটারটি রেফ পরিবর্তন করা হয়েছিল, তাই সেই মানটি "রেফ / হেড / মাস্টার" ছিল কিনা তা পরীক্ষা করতে আমরা এটি ব্যবহার করতে পারি। পোস্ট-রিসিভ হুকের ক্ষেত্রে আমি যা ব্যবহার করি তার সাথে সামান্য কিছুটা রুবি:

STDIN.each do |line|
    (old_rev, new_rev, ref_name) = line.split
    if ref_name =~ /master/
         # do your push
    end
end

নোট করুন যে এটি প্রতিটি রেফের জন্য একটি রেখা পায় যা ধাক্কা খায়, সুতরাং আপনি যদি কেবলমাত্র মাস্টারকেই বেশি চাপান, এটি এখনও কার্যকর হবে work


রুবির উদাহরণের জন্য ধন্যবাদ। আমি এর অনুরূপ কিছু করতে যাচ্ছি।
Leif

6

স্টিফানের উত্তর আমার পক্ষে কার্যকর হয়নি , তবে এটি হয়েছে :

#!/bin/bash

echo "determining branch"

if ! [ -t 0 ]; then
  read -a ref
fi

IFS='/' read -ra REF <<< "${ref[2]}"
branch="${REF[2]}"

if [ "master" == "$branch" ]; then
  echo 'master was pushed'
fi

if [ "staging" == "$branch" ]; then
  echo 'staging was pushed'
fi

echo "done"

একটি সাধারণ নাম (মাস্টার, পরীক্ষা ইত্যাদি) সহ শাখাগুলির জন্য আমার জন্য কাজ করেছিল, তবে যখন আমার শাখার নাম যেমন: প্রোড 12 / প্রোজ 250 / রপসপ্যাচ 12। এটি ভাল কাজ করে না। আপনার কি এমন কোনও সমাধান রয়েছে যা এই বিশেষ চরিত্রগুলির সাথে কাজ করতে পারে?
শচর হামুজিম রাজুয়ান

3

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

এখানে ঠিক পোস্ট-আপডেট হুক রয়েছে যা আমি এখনই CentOS 6.3 এ সফলভাবে পরীক্ষা করেছি।

#!/bin/bash

echo "determining branch"

branch=`echo $1 | cut -d/ -f3`

if [ "master" == "$branch" ]; then
    echo "master branch selected"
fi

if [ "staging" == "$branch" ]; then
    echo "staging branch selected"
fi

exec git update-server-info

আপডেট: এমনকি অপরিচিত নোটে, প্রাক-প্রাপ্ত হুক স্ট্যান্ডিনের মাধ্যমে তার ইনপুট নেয়, অতএব 'পড়ুন' দিয়ে পড়ুন (বাহ, কখনই ভাবিনি যে আমি এটি বলব)। পোস্ট-আপডেট হুক এখনও আমার জন্য 1 ডলার দিয়ে কাজ করে।


2
এটির মূল্যের জন্য, উপরের সমাধানগুলি কার্যকর নাও করতে পারে কারণ তারা বিশেষত post-receiveহুকগুলির জন্য, হুক নয় post-update। তারা বিভিন্নভাবে তাদের ইনপুট নেয়।
পলজজ

post-receiveএখানে উল্লিখিত হিসাবে স্টিডিন
কাস্টমাইজিং- গিট-

1

@ পলজজ থেকে উত্তর নির্দিষ্ট গিট হুকের মতো জরিমানা কাজ করে pre-pushতবে pre-commitসেই পরিবর্তনশীলগুলিতে অ্যাক্সেস নেই accessoldrev newrev refname

সুতরাং আমি এই বিকল্প সংস্করণটি তৈরি করেছি যা প্রাক-প্রতিশ্রুতি, বা সত্যই এবং হুকের জন্য কাজ করে। এটি এমন একটি pre-commitহুক যা huskyস্ক্রিপ্ট চালাবে যদি আমরা masterশাখায় না থাকি ।

#!/bin/bash
# git 'commit' does not have access to these variables: oldrev newrev refname
# So get the branch name off the head

branchPath=$(git symbolic-ref -q HEAD) # Something like refs/heads/myBranchName
branch=${branchPath##*/}      # Get text behind the last / of the branch path

echo "Head: $branchPath";
echo "Current Branch: $branch";

if [ "master" != "$branch" ]; then

   # If we're NOT on the Master branch, then Do something
   # Original Pre-push script from husky 0.14.3

   command_exists () {
     command -v "$1" >/dev/null 2>&1
   }

   has_hook_script () {
     [ -f package.json ] && cat package.json | grep -q "\"$1\"[[:space:]]*:"
   }

   cd "frontend" # change to your project directory, if .git is a level higher

   # Check if precommit script is defined, skip if not
   has_hook_script precommit || exit 0

   # Node standard installation
   export PATH="$PATH:/c/Program Files/nodejs"

   # Check that npm exists
   command_exists npm || {
     echo >&2 "husky > can't find npm in PATH, skipping precommit script in package.json"
     exit 0
   }

   # Export Git hook params
   export GIT_PARAMS="$*"

   # Run npm script
   echo "husky > npm run -s precommit (node `node -v`)"
   echo

   npm run -s precommit || {
     echo
     echo "husky > pre-commit hook failed (add --no-verify to bypass)"
     exit 1
   }
fi

আমি আশা করি যে কাউকে সাহায্য করবে বিবৃতি ifএবং fiবিবৃতিগুলির মধ্যে যে কোনও কিছুতে আপনি আপনার প্রয়োজনগুলির জন্য সহজেই সংশোধন করতে পারেন ।


0

এই কার্যকারিতাটি করার জন্য আমি নিজের জন্য একটি পিএইচপি স্ক্রিপ্ট লিখেছিলাম।

https://github.com/fotuzlab/githubdump-php

আপনার সার্ভারে এই ফাইলটি হোস্ট করুন, অগ্রাধিকারের মূলটি রিপো করুন এবং গিথুব ওয়েবহুকগুলিতে ইউআরএল সংজ্ঞায়িত করুন। আপনার শাখার নাম সহ 8 লাইনে 'অলকমিট' পরিবর্তন করুন এবং 18 নম্বর লাইনে আপনার কোড / ফাংশন যুক্ত করুন।

যেমন

function githubdump($payload_object) {
    // Write your code here.
    exec('git push origin master');
}

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