2013-11-09 2 views
6

मैं Git रूट फ़ोल्डर, जिसका निरपेक्ष पथ /path/project/ है पर हूँ पर काम करता है। फ़ोल्डर संरचना है:Git rm प्रतीकात्मक कड़ी के सापेक्ष पथ नहीं बल्कि निरपेक्ष पथ

/path/project 
---- libs/alib (actual library folder) 
---- exec/alib_link (symbolic link to the actual alib folder) 

मैं रिश्तेदार पथ का उपयोग git rm साथ सांकेतिक लिंक निकाल सकते हैं: git rm exec/alib_link

लेकिन निरपेक्ष पथ का उपयोग कर अपने मूल फ़ोल्डर को हटाने की कोशिश करने Git का कारण बनता है बजाय

git rm /path/project/alib_link 
fatal: not removing /path/project/libs/alib recursively without -r 

कैसे क्या मैं अपनी मूल निर्देशिका को हटाने का प्रयास किए बिना पूर्ण पथ का उपयोग करके प्रतीकात्मक लिंक को हटाने के लिए गिट को मजबूर कर सकता हूं?

उत्तर

3

सबसे अच्छा मैं के लिए इस पर्ल का उपयोग कर एक Git अन्य नाम है के साथ आने कर लिया है:

rma = "!f() { r=`echo $1 | perl -e 'use Path::Class; $a=file(<>); $r=$a->relative(\".\"); print $r;'`; git rm $r; }; f" 

फिर आप अपने भंडार के भीतर

git rma /path/project/alib_link 
कहीं से भी

कर सकते हैं साथ इच्छित प्रभाव।


यह कैसे काम करता:

  • Git उर्फ ​​rma खोल समारोह f कहता है।
  • यह $1 पर्ल के लिए (git rma को तर्क) echo का उपयोग कर स्ट्रीम। पर्ल <> का उपयोग करने में इसे पढ़ता है।
  • पर्ल चर $a का उपयोग उस फ़ाइल को संदर्भित करने के लिए किया जाता है जिसे आप अपने पूर्ण पथ का उपयोग करके निकालने का प्रयास कर रहे हैं।
  • पर्ल चर $r फ़ाइल आप काम कर निर्देशिका के लिए अपने रास्ते रिश्तेदार का उपयोग कर दूर करने के लिए कोशिश कर रहे हैं उल्लेख करने के लिए प्रयोग किया जाता है। ध्यान दें कि गिट उपनाम जो रन शेल कमांड को रिपोजिटरी रूट का उपयोग अपनी कार्यशील निर्देशिका के रूप में करते हैं।
  • रिश्तेदार पथ यह मुद्रण द्वारा पर्ल से "लौटे" है। यह तो खोल चर $r में संग्रहित है।
  • अंत में, हम git rm $r चलाने वास्तव में फ़ाइल को हटाने के लिए। ध्यान दें कि यह कार्यशील निर्देशिका में भी चलाता है (यानी भंडार रूट)।

एक अधिक संक्षिप्त संस्करण हो सकता है:

rma = "!f() { git rm `perl -e 'use Path::Class; print file($ARGV[0])->relative(\".\");' $1`; }; f" 
+0

+10 कि Git उपनाम निर्देशिका काम कर के रूप में भंडार जड़ का उपयोग ओर इशारा करते हुए के लिए। मैं यह देखने के लिए थोड़ा इंतजार करूंगा कि क्या कोई बेहतर विकल्प साथ आता है लेकिन आपकी मदद के लिए धन्यवाद। –

+0

@LimH .: कोई जांच नहीं। यह ध्यान देने योग्य है कि केवल गिट उपनाम जो शैल सामान करते हैं, उनकी कार्यशील निर्देशिका के रूप में भंडार रूट का उपयोग करते हैं। यदि आप 'rmr = rm -r' जैसे उपनाम बनाते हैं, तो यह वर्तमान निर्देशिका का उपयोग करता है। एक और अवलोकन के रूप में - मैंने इस के साथ खेलने की प्रक्रिया में खोज की है कि रिपोजिटरी रूट से संबंधित कार्यशील निर्देशिका के सापेक्ष पथ को पर्यावरण परिवर्तनीय GIT_PREFIX में संग्रहीत किया जाना चाहिए, इसकी आवश्यकता होनी चाहिए। –

संबंधित मुद्दे