गिट में हुक का प्रतीकात्मक लिंक


86

मैंने अपना स्वयं का कस्टम पोस्ट-मर्ज हुक लिखा, अब मैंने अपने मुख्य प्रोजेक्ट फ़ोल्डर में "हुक" निर्देशिका जोड़ी (क्योंकि git init / हुक में परिवर्तन को ट्रैक नहीं करता है), कहीं मैंने पढ़ा है कि मैं हुक से एक प्रतीकात्मक लिंक बना सकता हूं। .it / हुक के लिए, इसलिए मुझे किसी फ़ोल्डर को दूसरी बार हर बार किसी व्यक्ति को इसे बदलने की फ़ाइल को कॉपी करने की ज़रूरत नहीं है इसलिए मैंने कोशिश की:

ln -s -f hooks/post-merge .git/hooks/post-merge

लेकिन यह काम नहीं लगता, किसी भी विचार क्यों? "ln हुक / पोस्ट-मर्ज। .it / हुक / पोस्ट-मर्ज" ठीक काम करता है, लेकिन एक कठिन लिंक बनाना copyin मुझे लगता है के समान है ...।


22
क्योंकि सिम्लिंक को उसके स्थान के सापेक्ष हल किया जाता है। .git/hooks/उस बिंदु पर एक सिमिलिंक को hooks/post-mergeहल किया जाता है .git/hooks/hooks/post-merge, जो मौजूद नहीं है। आप चाहते हैं ln -s -f ../../hooks/post-merge .git/hooks/post-merge। या अपने जीवन को आसान बनाएं ln -s -f ../hooks .git/hooks:। आपकी समस्या का git से कोई लेना-देना नहीं है।
अरस्तू पगलतज़िस

1
stackoverflow.com/questions/3462955/… और stackoverflow.com/questions/427207/… (और stackoverflow.com/questions/3703159/… ) इस तथ्य को इंगित करता है कि सिमलिंक काम कर सकता है।
वॉनसी

अगर मैं गलत हूं तो मुझे सुधारें, लेकिन अभी भी एक सिमिंक को प्रति कार्य केंद्र सेटअप करना होगा। केवल एक चीज जो इसे बचाता है, इसे मैन्युअल रूप से कॉपी कर रहा है या एक और कमांड लिख रहा है जो ट्रैक की गई हुक फ़ाइल को कॉपी करता है .git/hooks
एडी ५१

जवाबों:


161

आपने सिर्फ गलत रास्ते का इस्तेमाल किया है, यह होना चाहिए:

ln -s -f ../../hooks/post-merge .git/hooks/post-merge

10
मुझे समझ नहीं आ रहा है कि मुझे उस संसाधन को लिंक करने के लिए दो निर्देशिकाओं में जाने की आवश्यकता क्यों है जो उस फ़ोल्डर में रहती है जिसे मैंने बनाया है cd। यह सिर्फ नहीं होना चाहिए ln -s ./hooks/?
Droogans

45
यह। जब git सिम्लिंक का मूल्यांकन कर रहा होता है, तो यह स्पष्ट .git/hooksरूप से अपनी कार्यशील निर्देशिका के रूप में उपयोग करता है , इसलिए रिश्तेदार पथ उस निर्देशिका के सापेक्ष होना चाहिए। यह और अधिक आत्म व्याख्यात्मक अगर आप पहले है cdमें .git/hooksसिमलिंक बनाने से पहले, और आंकड़ा बाहर वहाँ से रिश्तेदार पथ।
एलियट

12
@ काम की निर्देशिका से न तो सृजन और न ही सहानुभूति का संकल्प प्रभावित होता है। आप जो भी देते हैं lnउसे लक्ष्य के रूप में संग्रहीत किया जाएगा और लिंक के स्थान के सापेक्ष हल किया जाएगा।
दादाम

2
@ Joóádám आप सही कह रहे हैं। तो यहाँ मुद्दा यह है कि मूल कमांड एक गलत सापेक्ष पथ निर्दिष्ट करता है। फिर भी, लिंक बनाने से पहले cdआईएनजी .git/hooksआपको कमांड लिखने में मदद करेगा, क्योंकि आप तब तक सही रास्ते पर स्वत: पूर्ण हो सकते हैं।
एलियट

1
यह सब मेरे लिए अंत में काम आया। फर्क सिर्फ इतना है कि मैं अपने को जोड़ रहा हूं prepare-commit-msg। समस्या यह है कि अगर मैं नैनो का उपयोग करके प्रतिबद्ध संदेश को संपादित कर रहा हूं, तो सीटीएल + एक्स को बाहर करने के लिए, जीआईटी अभी भी किसी भी तरह से गर्भपात करने के बजाय एक प्रतिबद्ध पूरा करता है जैसे कि मैंने इसे बदलने से पहले इस्तेमाल किया था। वहाँ एक तरीका है नैनो बाहर निकलने के लिए यह पूरा करने के लिए प्रतिबद्ध बिना कारण है?
frakman1

15

जब आप प्रतीकात्मक लिंक का उपयोग कर सकते हैं, तो आप अपने git सेटिंग्स में अपने प्रोजेक्ट के लिए हुक फ़ोल्डर को भी बदल सकते हैं:

git config core.hooksPath hooks/

जो डिफ़ॉल्ट रूप से स्थानीय है, इसलिए यह आपके अन्य प्रोजेक्ट्स के लिए गिट हुक को बर्बाद नहीं करेगा। यह इस रिपॉजिटरी में सभी हुक के लिए काम करता है, इसलिए यदि आपके पास एक से अधिक हुक हैं तो यह विशेष रूप से उपयोगी है।

यदि आपके पास पहले से ही कस्टम हुक हैं .git/hooks/, तो आप अपनी टीम के साथ साझा नहीं करना चाहते हैं आप उन्हें हुक में जोड़ सकते हैं / और जोड़ .gitignoreसकते हैं ताकि वे साझा किए जा सकें।


बहुत अच्छा! एक आसान ट्रिक :) एक-एक करके उन्हें जोड़ने से ज्यादा भविष्य में प्रूफ लगता है।
14

2

लिंक करने से पहले निर्देशिका बदलना

cd /path/to/project-repo/.git/hooks
ln -s -f ../../hooks/post-merge ./post-merge

और भी सरल, इसके बाद cd:ln -s -f ../../hooks/post-merge
jamesdlin

0

पथ की गणना सिमलिंक के सापेक्ष की जाती है। आइए एक उदाहरण का उपयोग करके समझते हैं,

ln -s path/to/file symlink/file

यहां, फ़ाइल का पथ वास्तव में सिम्लिंक पथ से संबंधित पथ होना चाहिए।
सिस्टम वास्तव में फ़ाइल पथ की गणना करता है क्योंकि symlink/path/path/to/file
उपरोक्त कमांड को

ln -s ../path/to/file symlink/path

फ़ोल्डर संरचना के रूप में फिर से लिखा जाना चाहिए ,

/ कोड
------ सिमलिंक / फ़ाइल
------ पथ / से / फ़ाइल


0

माइकल सिहर की टिप्पणी का उपयोग करते हुए, मैंने यहाँ एक बैश स्क्रिप्ट का उदाहरण दिया है, जिसे मैंने केवल इन सिम्बल को बनाने के लिए लिखा था। यह स्क्रिप्ट git_hooks / dir में स्थित है जो प्रोजेक्ट रूट पर है। मेरा .it / फ़ोल्डर भी उसी निर्देशिका स्तर में है।

#!/usr/bin/env bash

pwd=$(pwd);

# Script is designed to be ran from git_hooks/ dir
if [[ "$pwd" == *"git_hooks"* ]]; then

  files=$(ls | grep -v -e '.*\.');

   while read -r file; do

     ln -s ../../git_hooks/$file ../.git/hooks/
     echo "Linked $file -> ../.git/hooks/$file"

   done <<< "$files";

else

  echo "";
  echo "ERROR: ";
  echo "You must be within the git_hooks/ dir to run this command";
  exit 1;

fi

मेरी स्क्रिप्ट को वास्तविक git_hooks / निर्देशिका के भीतर से चलाया जाना चाहिए। यदि आप चाहें तो आप इसे अलग तरह से व्यवहार करने के लिए संशोधित कर सकते हैं।

यह स्क्रिप्ट किसी भी फ़ाइल को समिट करेगी जो कि git_hooks / निर्देशिका के भीतर फ़ाइल एक्सटेंशन के साथ प्रत्यय नहीं है। मेरे पास इस निर्देशिका में + README.txt है (इस स्क्रिप्ट का नाम symlink.sh है)। सभी वास्तविक git हुक को 'प्री-कमिट', 'प्री-पुश' इत्यादि नाम दिए गए हैं, इसलिए उन्हें सिमिलिंक किया जाएगा।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.