সংগ্রহশালায় গিট হুক লাগানো


197

এটি কি খারাপ অভ্যাস হিসাবে বিবেচনা করা হয় - প্রকল্পের সংগ্রহস্থলের মধ্যে .git / হুক স্থাপন করা (উদাহরণস্বরূপ সিমলিঙ্কগুলি ব্যবহার করে)। যদি হ্যাঁ, বিভিন্ন গিট ব্যবহারকারীদের কাছে একই হুক সরবরাহ করার সর্বোত্তম উপায় কী?

উত্তর:


143

আমি সাধারণত একাধিক অতিরিক্ত পরামর্শ সহ সিসটেলের সাথে একমত হই, এটির পক্ষে পৃথক উত্তরের উপযুক্ত enough

প্রথমত, আপনাকে এমন একটি স্ক্রিপ্ট লিখতে হবে যা উপযুক্ত প্রতিলিঙ্ক তৈরি করে, বিশেষত যদি এই হুকগুলি নীতি প্রয়োগ বা কার্যকর বিজ্ঞপ্তি তৈরির বিষয়ে হয়। লোকেরা হুকগুলি ব্যবহার করার অনেক বেশি সম্ভাবনা bin/create-hook-symlinksথাকবে যদি তারা নিজেরাই তা করতে হয় তবে কেবল টাইপ করতে পারে।

দ্বিতীয়ত, সরাসরি সিমলিংকিং হুক ব্যবহারকারীদের নিজস্ব ব্যক্তিগত হুক যোগ করতে বাধা দেয়। উদাহরণস্বরূপ, আমি বরং নমুনা প্রাক কমিট হুক পছন্দ করি যা নিশ্চিত করে যে আমার কোনও সাদা জায়গা ত্রুটি নেই। এর চারপাশের দুর্দান্ত উপায় হ'ল আপনার রেপোতে একটি হুক র‍্যাপার স্ক্রিপ্টটি ফেলে দেওয়া এবং এটিতে সমস্ত হুকের সিমিলিংক করা। এর পরে মোড়কটি পরীক্ষা করতে পারে $0(এটি একটি বাশ স্ক্রিপ্ট ধরে নেওয়া; argv[0]অন্যথায় এর সমতুল্য ) এটি চিহ্নিত করা হয়েছিল যে এটি কোন হুক হিসাবে চিহ্নিত হয়েছিল, তারপরে আপনার রেপোর মধ্যে যথাযথ হুকটি অনুরোধ করুন, পাশাপাশি উপযুক্ত ব্যবহারকারীর হুকটিও নামকরণ করতে হবে , প্রতিটি আর্গুমেন্ট পাস। স্মৃতি থেকে দ্রুত উদাহরণ:

#!/bin/bash
if [ -x $0.local ]; then
    $0.local "$@" || exit $?
fi
if [ -x tracked_hooks/$(basename $0) ]; then
    tracked_hooks/$(basename $0) "$@" || exit $?
fi

ইনস্টলেশন স্ক্রিপ্ট সমস্ত পূর্ব-বিদ্যমান হুকগুলি পাশের দিকে সরিয়ে নিয়ে যাবে ( .localতাদের নামগুলিতে সংযোজন করবে) এবং উপরের স্ক্রিপ্টে সমস্ত পরিচিত হুকের নাম সিমিলিংক করবে:

#!/bin/bash
HOOK_NAMES="applypatch-msg pre-applypatch post-applypatch pre-commit prepare-commit-msg commit-msg post-commit pre-rebase post-checkout post-merge pre-receive update post-receive post-update pre-auto-gc"
# assuming the script is in a bin directory, one level into the repo
HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks

for hook in $HOOK_NAMES; do
    # If the hook already exists, is executable, and is not a symlink
    if [ ! -h $HOOK_DIR/$hook -a -x $HOOK_DIR/$hook ]; then
        mv $HOOK_DIR/$hook $HOOK_DIR/$hook.local
    fi
    # create the symlink, overwriting the file if it exists
    # probably the only way this would happen is if you're using an old version of git
    # -- back when the sample hooks were not executable, instead of being named ____.sample
    ln -s -f ../../bin/hooks-wrapper $HOOK_DIR/$hook
done

6
আমি chmod +x .git/hooks/*আপনার bin/create-hook-symlinks এটি যুক্ত করতে যোগ ।
guneysus

6
@ গুনিয়াসস আপনার এটির দরকার নেই, কারণ হুকগুলি ইতিমধ্যে সম্পাদনযোগ্য হওয়া উচিত (সেগুলি সেই পদ্ধতিতে পরীক্ষা করা উচিত) এবং লিঙ্কগুলির কোনও বিশেষ অনুমতি প্রয়োজন হয় না, কেবল যে ফাইলগুলি তারা লিঙ্ক করে।
ক্যাসাবেল

13
হুক দির পাওয়ার আরও ভাল উপায় HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
আর্নল্ড ড্যানিয়েল

2
আমার প্রকল্পের হুকগুলি পরিচালনা করতে আমি এর উপর ভিত্তি করে একটি সাধারণ সিস্টেম একসাথে রেখেছি: ell.io/tt$Paws.js/blob/Master/Scriptts/install-git-hooks.sh
এলিওটিটিসিবল

6
আমি কেবল প্রয়োজনীয় জিনিসগুলি নিয়েছি
স্কট

111

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


13
যদি এটি কোনও কোম্পানির পলিসি জিনিস হয় তবে কোডটি "স্বেচ্ছাচারিত" নয় এটি প্রয়োজনীয় কোড, সুতরাং এটি জিআইটি-র একটি সীমাবদ্ধতা হিসাবে বিবেচিত হবে, অন্য কোনও (পূর্বনির্ধারিত) ডিরেক্টরি না থাকার জন্য, যা ট্র্যাক করা হয়েছে, যা পায় নিয়মিত হুকের সাথে মৃত্যুদন্ড কার্যকর করা হয়েছিল
টোবিয়াস হ্যাগেনবিক

14
স্বয়ংক্রিয়ভাবে হুক সরবরাহ করা একটি সুরক্ষা সমস্যা, আমি আনন্দিত যে গিট এটি সরাসরি করে না - দল / সংস্থার নীতি প্রয়োগ করতে, সার্ভারের পাশে হুক ব্যবহার করতে বা ব্যবহারকারীদের ম্যানুয়ালি @ সিসির বর্ণনা হিসাবে এটি সক্ষম করার সিদ্ধান্ত নিতে পারে :)
চিহ্নিত করুন কে কোয়ান

4
"ব্যবহারকারীদের সম্মতি ছাড়াই নির্বিচারে কোড চালানো থেকে [...] রক্ষা করে"। যদি কোনও বিকাশকারী আপনার প্রস্তাব মতো (সিলেকিং) করেন তবে হুকটি অন্য কারও দ্বারা পরিবর্তন করা যেতে পারে এবং "তাদের সম্মতি ছাড়াই নির্বিচার কোড" চালানো যেতে পারে
MiniGod

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

46

আজকাল আপনি যদি একটি ডিরেক্টরি সংস্করণ নিয়ন্ত্রণে থাকেন তবে আপনার Git আঙ্গুলসমূহ ডিরেক্টরি হতে সেট করতে নিচের কাজগুলো করতে পারেন, যেমন, MY_REPO_DIR/.githooksহবে

git config --local core.hooksPath .githooks/

এখনও সরাসরি প্রয়োগযোগ্য নয় তবে আপনি যদি আপনার README (বা যাই হোক না কেন) একটি নোট যোগ করেন তবে এর জন্য প্রতিটি বিকাশকারীর পক্ষে সর্বনিম্ন প্রচেষ্টা প্রয়োজন।


3
Viget.com/articles/two-ways-to-share-git-hooks-with-Your-team- এ আমি পেয়েছি এমন একটি কৌশলটি আপনার মেকফিল / সিএমকে কনফিগারেশন / যাই হোক না কেন থেকে বিকল্পটি সেট করা।
জুলিয়াস বুলিংগার

6

Http://git-scm.com/docs/git-init#_template_directory থেকে , আপনি প্রতিটি সদ্য নির্মিত গিট রেপোর .git / হুক দির আপডেট করতে এই পদ্ধতিগুলির একটি ব্যবহার করতে পারেন:

টেমপ্লেট ডিরেক্টরিতে ফাইল এবং ডিরেক্টরি রয়েছে যা এটি তৈরির পরে $ GIT_DIR এ অনুলিপি করা হবে।

টেম্পলেট ডিরেক্টরি নিম্নলিখিতগুলির মধ্যে একটি হবে (ক্রম):

  • --template বিকল্পের সাহায্যে প্রদত্ত যুক্তি;

  • vari GIT_TEMPLATE_DIR এনভায়রনমেন্ট ভেরিয়েবলের সামগ্রী;

  • init.templateDir কনফিগারেশন পরিবর্তনশীল; অথবা

  • ডিফল্ট টেম্পলেট ডিরেক্টরি: / usr / ভাগ / গিট-কোর / টেম্পলেট।


5

প্রকল্পে সঞ্চয় করুন এবং বিল্ডে ইনস্টল করুন

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

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

জাভা ও মাভেন

সম্পূর্ণ অস্বীকৃতি; আমি নীচে বর্ণিত মাভেন প্লাগইন লিখেছি।

আপনি যদি আপনার জাভা প্রকল্পগুলির জন্য মাভেনের সাথে বিল্ড ম্যানেজমেন্ট পরিচালনা করছেন, তবে নীচের মাভেন প্লাগইন আপনার প্রকল্পের কোনও স্থান থেকে হুক ইনস্টল করতে পরিচালনা করবে।

https://github.com/rudikershaw/git-build-hook

আপনার সমস্ত গিট হুকগুলি আপনার প্রকল্পের একটি ডিরেক্টরিতে রাখুন, তারপরে আপনার pom.xmlনিম্নলিখিত প্লাগইন ঘোষণা, লক্ষ্য এবং কনফিগারেশন অন্তর্ভুক্ত করতে কনফিগার করুন।

<build>
  <plugins>
    <plugin>
      <groupId>com.rudikershaw.gitbuildhook</groupId>
      <artifactId>git-build-hook-maven-plugin</artifactId>
      <configuration>
        <gitConfig>
          <!-- The location of the directory you are using to store the Git hooks in your project. -->
          <core.hooksPath>hooks-directory/</core.hooksPath>
        </gitConfig>
      </configuration>
      <executions>
        <execution>
          <goals>       
            <!-- Sets git config specified under configuration > gitConfig. -->
            <goal>configure</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
      <!-- ... etc ... -->
  </plugins>
</build>

আপনি যখন আপনার প্রকল্পটি পরিচালনা করেন প্লাগইন নির্দিষ্ট ডিরেক্টরি থেকে হুক চালানোর জন্য গিটকে কনফিগার করবে। এটি কার্যকরভাবে আপনার প্রকল্পে কাজ করা প্রত্যেকের জন্য ডিরেক্টরিতে হুকগুলি সেট আপ করবে।

জাভাস্ক্রিপ্ট এবং এনপিএম

NPM জন্যে রয়েছে নির্ভরতা বলা হয় বলবান আপনি জাভাস্ক্রিপ্ট লেখা বেশী সহ আঙ্গুলসমূহ ইনস্টল করতে দেয়।

// package.json
{
  "husky": {
    "hooks": {
      "pre-commit": "npm test",
      "pre-push": "npm test",
      "...": "..."
    }
  }
}

অন্যান্য

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


1
এই প্লাগইনটি তৈরি করার জন্য ধন্যবাদ, এটি আমার প্রাক-কমিট ফাইলটিকে খুব সহজেই একীভূত করেছে।
মিশিল বুগের


1

সুরকার ভিত্তিক পিএইচপি প্রকল্পগুলির জন্য আপনি ইঞ্জিনিয়ারগুলিতে স্বয়ংক্রিয়ভাবে বিতরণ করতে পারেন। প্রাক-কমিট এবং কমিট-হিক্স হুকের উদাহরণ এখানে is

একটি hooksফোল্ডার তৈরি করুন , তারপরে আপনার রচয়িতা জসনে:

 },
 "scripts": {
     "post-install-cmd": [
         "cp -r 'hooks/' '.git/hooks/'",
         "php -r \"copy('hooks/pre-commit', '.git/hooks/pre-commit');\"",
         "php -r \"copy('hooks/commit-msg', '.git/hooks/commit-msg');\"",
         "php -r \"chmod('.git/hooks/pre-commit', 0777);\"",
         "php -r \"chmod('.git/hooks/commit-msg', 0777);\"",
     ],

তারপরে আপনি এগুলিকে আপডেট করতে পারেন যেমন প্রকল্পটি composer installনিয়মিতভাবে চলমান থাকায় চলতে থাকে।


0

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

#!/usr/bin/bash
# Adds the git-hook described below. Appends to the hook file
# if it already exists or creates the file if it does not.
# Note: CWD must be inside target repository

HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
HOOK_FILE="$HOOK_DIR"/post-commit

# Create script file if doesn't exist
if [ ! -e "$HOOK_FILE" ] ; then
        echo '#!/usr/bin/bash' >> "$HOOK_FILE"
        chmod 700 "$HOOK_FILE"
fi

# Append hook code into script
cat >> "$HOOK_FILE" <<EOF

########################################
# ... post-commit hook script here ... #
########################################

EOF

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

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


আমি আপনার প্রচেষ্টার প্রশংসা করি এবং বিশ্বাস করি যে এখানে একটি মূল্যবান তথ্য রয়েছে - তবে এতে বলা প্রশ্নের উত্তর নেই।
shabunc

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

অতিরিক্তভাবে, প্রতীকী লিঙ্কগুলি ব্যবহারকারীদের নিজস্ব হুক যোগ করার ক্ষমতা ভঙ্গ করে। .Git / hooks ডিরেক্টরিটি ট্র্যাক করা যায় নি তাই উত্সটি সংগ্রহস্থলটিতে শুরু হওয়া উচিত এবং হুক স্ক্রিপ্টে প্রবেশ করা উচিত, অন্যভাবে নয় not আমি মনে করি যে পাল্টা যুক্তিটি হ'ল গিট হুকগুলি প্রকল্পের চেয়ে ওয়ার্কফ্লো বা টিমের সাথে আরও সম্পর্কিত এবং সুতরাং এটি স্টোরের মধ্যে নেই। আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে, আপনি কম-সম্পর্কিত হুক দিয়ে গিট সংগ্রহস্থলকে সম্ভাব্যভাবে দূষিত করার সাথে আরও ঠিক আছেন বা অন্য কোথাও রাখার ক্ষেত্রে আপনি কি জটিলতার একগুচ্ছ ভবিষ্যদ্বাণী করবেন?
ম্যাথেজুয়েস্ট

0

প্রাক কমিটের মতো প্রাক কমিট হুক পরিচালনার জন্য আপনি একটি পরিচালিত সমাধান ব্যবহার করতে পারেন । অথবা সার্ভার-সাইড গিট-হুকের জন্য ডেটারি.ওয়ের জন্য কেন্দ্রীয় সমাধান । এটিতে অন্তর্নির্মিত নীতিগুলি রয়েছে:

  1. গোপনীয়তাগুলি মার্জ করে সনাক্ত করুন এবং প্রতিরোধ করুন ।
  2. যথাযথ গিট ব্যবহারকারী কনফিগারেশন প্রয়োগ করুন ।
  3. জিরা টিকিট সংহতকরণ প্রয়োগ করুন - টিকের অনুরোধের নাম / প্রতিশ্রুতি বার্তায় টিকিটের নম্বর উল্লেখ করুন।

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

দাবি অস্বীকার: আমি ডেটারিসের অন্যতম প্রতিষ্ঠাতা


3
আমি মনে করি আপনি একটি আকর্ষণীয় পণ্য তৈরি করছেন তবে আমার মনে হয় এটি প্রশ্নের উত্তর দেয় না এবং মূলত একটি স্ব-প্রচার এবং এর চেয়ে বেশি কিছুই নয় nothing
শাবঙ্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.