গিট প্রি-পুশ হুকস


115

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


সম্পর্কিত: stackoverflow.com/questions/31681746
tkruse

উত্তর:


14

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


203
আমি সাধারণত একমত, যদিও আপনি যদি পরে স্কোয়াশে প্রচুর পরিমাণে বর্ধনমূলক অঙ্গীকার করার অভ্যাসে থাকেন এবং পরীক্ষার স্যুইটটি বড় হয় তবে এটি অযৌক্তিক হতে পারে।
ক্যাসকেবেল

আমি দেখি. সুতরাং আমি প্রধান শাখায় মার্জ হওয়ার আগে পরীক্ষাগুলি চালানোর পরামর্শ দিচ্ছি তবে প্রাক-মার্জ হুক নেই is তবে একটি "আপডেট" হুক উইচ রয়েছে যা রিমোট রিপোজিটরিতে রিফ আপডেট করা রোধ করতে ব্যবহার করা যেতে পারে: "রিমোট রিপোসিটরিতে রিফ আপডেট করার আগে আপডেট হুকটি চাওয়া হয় Its এর প্রস্থান স্থিতি রেফার সাফল্য বা ব্যর্থতা নির্ধারণ করে আপডেট। প্রতিটি রেফ আপডেট হওয়ার জন্য হুক একবার সম্পাদন করে এবং তিনটি প্যারামিটার লাগে: রেফের নাম আপডেট করা হচ্ছে, রেফে সংরক্ষণ করা পুরাতন অবজেক্টের নাম এবং নতুন অবজেক্টনাম রেফে সংরক্ষণ করতে হবে। "
আরডনংসউইড্রিগ

18
ডাউন ভোট দিয়েছে কারণ - তথ্যপূর্ণ থাকাকালীন - এটি ওপির প্রশ্নটিকে সম্পূর্ণ উপেক্ষা করে।
ডেমবিনস্কি

1
@ দিডেমবিনস্কি আমি বলব না যে এটি ওপি প্রশ্নটিকে উপেক্ষা করে। আসলে এটি এটিকে বিবেচনায় নিয়েছে এবং বলেছে যে ওপি যেভাবে মনে রেখেছে তার চেয়ে আরও ভাল উপায় আছে। এটি সাধারণভাবে উত্তরটি আমি পেতে চাই।
calder.ty

9
@ Calder.ty - নাহ। মনোজাল্ড গুরুত্বপূর্ণ বিষয়গুলিকে আরও ভালভাবে সম্বোধন করে। প্রকৃতপক্ষে, প্রাক কমিট হুকগুলি যা পরীক্ষা চালায় তা সাধারণত খারাপ ধারণা ইমো। এটি ধরে নিয়েছে যে প্রতিশ্রুতিবদ্ধ সমস্ত জিনিস অবশ্যই পরীক্ষায় উত্তীর্ণ হতে পারে। যা সাধারণ কাজের প্রবাহের জন্য খারাপ যা সহযোগিতার দিকে মনোনিবেশ করে। হ্যাঁ ... আমি একমত নই; এটি "এটি" করার সর্বোত্তম উপায় নয় বা এটি প্রশ্নের সমাধান করে না।
ডেমবিনস্কি

209

গিট রিলিজ এ pre-pushহুক পেয়েছে 1.8.2

নমুনা pre-pushলিপি: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample

1.8.2 রিলিজ নোটগুলি নতুন প্রি-পুশ হুক সম্পর্কে কথা বলছে: https://github.com/git/git/blob/master/Docamentation/RelNotes/1.8.2.txt


1
@manojlds আপনি কি জানেন যে এই হুকটি ব্যবহারের জন্য ডিজাইন করা হয়েছে? নির্দিষ্ট ব্রাঞ্চে ধাক্কা দেওয়ার সময় আমি এটি আমার গ্রাহকদের কাছে বাইনারি ঠেলাতে ব্যবহার করতে চাই (যেমন রাতের সংস্করণটি তৈরি করুন এবং চাপ দেওয়ার আগে এটি কার্ল দিয়ে আপলোড করুন)। সমস্যাটি হ'ল এটি নির্মাণ এবং আপলোড করতে কিছুটা সময় নেয় এবং রিমোট সংযোগ বন্ধ করে দেয়। সুতরাং আমি আমার বাইনারিটি নির্মিত এবং গ্রাহকদের কাছে আপলোড করেছি তবে কোনও রেপোতে ঠেলা যায় না, কারণ রিমোট রেপো সংযোগ বন্ধ করে দেয়। এই চারপাশে কাজ কিভাবে কোন ধারণা? অথবা এটির মূলের এটি একটি খারাপ ধারণা।
igrek

@igrek আপনি কি সংযোগ বন্ধের সমস্যার সমাধান খুঁজে পেয়েছেন?
মারিও এস্ট্রাদ

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

24

1.8.2 প্রকাশে গিট প্রাক-পুশ হুক পেয়েছে ook

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

এবং কীভাবে ব্যবহার করবেন (উদাহরণস্বরূপ এই দুর্দান্ত এন্ট্রি থেকে নেওয়া এবং গৃহীত হয়েছে এবং উন্নত করা হয়েছে )

ভিজাগ্রনে লগইন করা, পরীক্ষা চালানো এবং তারপরে চাপ দেওয়ার সহজ উদাহরণ

#!/bin/bash
# Run the following command in the root of your project to install this pre-push hook:
# cp git-hooks/pre-push .git/hooks/pre-push; chmod 700 .git/hooks/pre-push

CMD="ssh vagrant@192.168.33.10 -i ~/.vagrant.d/insecure_private_key 'cd /vagrant/tests; /vagrant/vendor/bin/phpunit'"
protected_branch='master'

# Check if we actually have commits to push
commits=`git log @{u}..`
if [ -z "$commits" ]; then
    exit 0
fi

current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

if [[ $current_branch = $protected_branch ]]; then
    eval $CMD
    RESULT=$?
    if [ $RESULT -ne 0 ]; then
        echo "failed $CMD"
        exit 1
    fi
fi
exit 0

যেমন আপনি দেখতে পাচ্ছেন উদাহরণটি একটি সুরক্ষিত শাখা ব্যবহার করে, প্রি-পুশ হুকের বিষয়।


14

আপনি যদি কমান্ড লাইনটি ব্যবহার করে থাকেন তবে এটির সবচেয়ে সহজ উপায় হ'ল পুশ স্ক্রিপ্ট লেখা যা আপনার ইউনিট পরীক্ষা চালায় এবং যদি তারা সফল হয় তবে পুশটি সম্পূর্ণ করে।

সম্পাদন করা

1.8.2 গিট হিসাবে এই উত্তরটি পুরানো। উপরে মনোজल्डস এর উত্তর দেখুন।


আপনি কি আদৌ হুক ব্যবহার করবেন না মানে? কেবল "গিট টান" এর সাথে প্রতিস্থাপন করুন, উদাহরণস্বরূপ, "গিট ইউিন্টেস্টসপুল"? আমার যা প্রয়োজন তা ঠিক তা নয়
মেষপালক

1
@ শিপওয়াকার: এস / টান / পুশ /, এবং এটি একটি সুন্দর এবং সংক্ষিপ্ত করতে একটি উপনাম ব্যবহার করুন।
ক্যাসকেবেল

@ শিপওয়াকার হ্যাঁ, আপনি যা চেয়েছিলেন ঠিক তা নয়, তবে @ ক্যালামহ বলেছেন, প্রাক-পুশ হুক নেই।
কুবি

8

এটির জন্য কোনও হুক নেই, কারণ কোনও ধাক্কা এমন কোনও ক্রিয়াকলাপ নয় যা আপনার ভাণ্ডারকে সংশোধন করে।

আপনি post-receiveহুক মধ্যে যদিও প্রাপ্তি পক্ষের চেকগুলি করতে পারেন । আপনি এখানে আগত ধাক্কা সাধারণত প্রত্যাখাত করবেন। চলমান ইউনিট পরীক্ষাগুলি হুক করতে কিছুটা নিবিড় হতে পারে তবে এটি আপনার পক্ষে।


6

রেকর্ডের জন্য, গিট 1.6 তে একটি প্যাচ রয়েছে যা প্রি-পুশ হুক যুক্ত করে । এটি 1.7 এর বিপরীতে কাজ করে কিনা আমি জানি না।

এর সাথে গণ্ডগোলের পরিবর্তে আপনি @ কুবির প্রস্তাবিত মতো পুশ স্ক্রিপ্টটি চালাতে পারেন। পরিবর্তে আপনি এটিকে একটি রেক টাস্কও তৈরি করতে পারেন তাই এটি আপনার রেপোতে রয়েছে। রুবি গিট এটি সাহায্য করতে পারে। আপনি যদি লক্ষ্য রেপো পরীক্ষা করেন তবে আপনি কেবল উত্পাদন রেপোতে চাপ দেওয়ার সময় পরীক্ষা চালাতে পারেন।

শেষ অবধি, আপনি নিজের পরীক্ষায় আপনার পরীক্ষা চালাতে পারেন pre-commitতবে কোন শাখার প্রতিশ্রুতিবদ্ধ তা পরীক্ষা করে দেখুন। তারপরে আপনার কাছে একটি বলতে, বলতে একটি productionশাখা থাকতে পারে যা প্রতিশ্রুতি গ্রহণের আগে সমস্ত পরীক্ষা পাস করতে masterপারে তবে আপনার যত্ন নেই। limerick_rake সেই দৃশ্যে কার্যকর হতে পারে।


ধন্যবাদ, আসলে আমি ইতিমধ্যে শেষ রূপটি বেছে নিয়েছি (অবশেষে, আপনি নিজের প্রাক-কমিট
হুকটিতে

1

স্ক্রিপ্ট অত্যন্ত ভোট উত্তর দ্বারা সংযুক্ত পরামিতি ইত্যাদি শো pre-pushহুক ( $1দূরবর্তী নাম, হয় $2এবং কিভাবে করে অ্যাক্সেস করতে URL টি) (লাইন readstdin থেকে কাঠামো আছে <local ref> <local sha1> <remote ref> <remote sha1>)

#!/bin/sh

# An example hook script to verify what is about to be pushed.  Called by "git
# push" after it has checked the remote status, but before anything has been
# pushed.  If this script exits with a non-zero status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
#   <local ref> <local sha1> <remote ref> <remote sha1>
#
# This sample shows how to prevent push of commits where the log message starts
# with "WIP" (work in progress).

remote="$1"
url="$2"

z40=0000000000000000000000000000000000000000

while read local_ref local_sha remote_ref remote_sha
do
    if [ "$local_sha" = $z40 ]
    then
        # Handle delete
        :
    else
        if [ "$remote_sha" = $z40 ]
        then
            # New branch, examine all commits
            range="$local_sha"
        else
            # Update to existing branch, examine new commits
            range="$remote_sha..$local_sha"
        fi

        # Check for WIP commit
        commit=`git rev-list -n 1 --grep '^WIP' "$range"`
        if [ -n "$commit" ]
        then
            echo >&2 "Found WIP commit in $local_ref, not pushing"
            exit 1
        fi
    fi
done

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