यदि आप अभी इस मामले में आ रहे हैं, तो मैं आज ही इसके माध्यम से आया हूं और संक्षेप में बता सकता हूं कि यह कहां खड़ा है। यदि आपने अभी तक यह कोशिश नहीं की है, तो यहां कुछ विवरण मदद कर सकते हैं।
मुझे लगता है कि @Omid Ariyan का तरीका सबसे अच्छा तरीका है। प्री-कमिट और पोस्ट-चेकआउट स्क्रिप्ट जोड़ें। डॉन 'टी उन्हें ठीक उसी तरह नाम देना भूल जाते हैं जिस तरह से ओमिद करते हैं और उन्हें अमल में लाना भूल जाते हैं। यदि आप उन दोनों में से किसी को भी भूल जाते हैं, तो उनका कोई प्रभाव नहीं पड़ता है और आप "जीट कमिट" को बार-बार सोचते हैं कि कुछ भी क्यों नहीं होता है :) इसके अलावा, यदि आप वेब ब्राउज़र से बाहर कट और पेस्ट करते हैं, तो सावधान रहें कि उद्धरण चिह्न और टिक नहीं हैं बदल दिया।
यदि आप प्री-कमिट स्क्रिप्ट को एक बार (git कमिट चलाकर) चलाते हैं, तो फ़ाइल .permissions बनाई जाएगी। आप इसे रिपॉजिटरी में जोड़ सकते हैं और मुझे लगता है कि प्री-कमिट स्क्रिप्ट के अंत में इसे बार-बार जोड़ना अनावश्यक है। लेकिन यह चोट नहीं करता है, मुझे लगता है (आशा)।
ओमिड की लिपियों में फ़ाइल नाम में निर्देशिका नाम और रिक्त स्थान के अस्तित्व के बारे में कुछ कम मुद्दे हैं। यहां रिक्त स्थान एक समस्या थी और मुझे IFS के फिक्स से कुछ परेशानी थी। रिकॉर्ड के लिए, इस प्री-कमिट स्क्रिप्ट ने मेरे लिए सही तरीके से काम किया:
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
# Clear the permissions database file
> $DATABASE
echo -n "Backing-up file permissions..."
IFSold=$IFS
IFS=$'\n'
for FILE in `git ls-files`
do
# Save the permissions of all the files in the index
echo $FILE";"`stat -c "%a;%U;%G" $FILE` >> $DATABASE
done
IFS=${IFSold}
# Add the permissions database file to the index
git add $DATABASE
echo "OK"
अब, हम इसमें से क्या निकालते हैं?
.Permissions फ़ाइल गिट रेपो के शीर्ष स्तर पर है। इसमें प्रति फ़ाइल एक पंक्ति है, यहाँ मेरा उदाहरण सबसे ऊपर है:
$ cat .permissions
.gitignore;660;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.doc;664;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.pdf;664;pauljohn;pauljohn
जैसा कि आप देख सकते हैं, हमारे पास है
filepath;perms;owner;group
इस दृष्टिकोण के बारे में टिप्पणियों में, पोस्टर में से एक शिकायत करता है कि यह केवल एक ही उपयोगकर्ता नाम के साथ काम करता है, और यह तकनीकी रूप से सच है, लेकिन इसे ठीक करना बहुत आसान है। नोट चेक-पोस्टआउट स्क्रिप्ट में 2 एक्शन टुकड़े हैं,
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
इसलिए मैं केवल पहला ही रख रहा हूं, बस इतना ही चाहिए। वेब सर्वर पर मेरा उपयोगकर्ता नाम वास्तव में अलग है, लेकिन इससे भी महत्वपूर्ण बात यह है कि जब तक आप रूट नहीं होते हैं तब तक आप चाउ को नहीं चला सकते हैं। हालांकि, "चंग्प" चला सकते हैं। यह इतना सादा है कि कैसे उपयोग किया जाए।
इस पोस्ट में पहले उत्तर में, जो सबसे अधिक व्यापक रूप से स्वीकार किया गया है, वह सुझाव है कि git-cache-meta का उपयोग करें, एक स्क्रिप्ट जो वही काम कर रही है जो यहां प्री / पोस्ट हुक स्क्रिप्ट कर रहे हैं (आउटपुट से पार्सिंग आउटपुट) git ls-files
) । ये स्क्रिप्ट मेरे लिए समझना आसान है, git-cache-meta कोड बल्कि अधिक विस्तृत है। रास्ते में गिट-कैश-मेटा रखना और प्री-कमिट और पोस्ट-चेकआउट स्क्रिप्ट लिखना संभव है जो इसका उपयोग करेगा।
फ़ाइल नामों में रिक्तियां ओमिड की दोनों लिपियों के साथ एक समस्या हैं। पोस्ट-चेकआउट स्क्रिप्ट में, आपको पता चल जाएगा कि यदि आपके पास इस तरह की त्रुटियां हैं, तो आपके पास फ़ाइल नामों में रिक्त स्थान हैं
$ git checkout -- upload.sh
Restoring file permissions...chmod: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chmod: cannot access 'Notebook.onetoc2': No such file or directory
chown: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chown: cannot access 'Notebook.onetoc2': No such file or directory
मैं उस के लिए समाधान पर जाँच कर रहा हूँ। यहाँ कुछ ऐसा है जो काम करने लगता है, लेकिन मैंने केवल एक ही मामले में परीक्षण किया है
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
echo -n "Restoring file permissions..."
IFSold=${IFS}
IFS=$
while read -r LINE || [[ -n "$LINE" ]];
do
FILE=`echo $LINE | cut -d ";" -f 1`
PERMISSIONS=`echo $LINE | cut -d ";" -f 2`
USER=`echo $LINE | cut -d ";" -f 3`
GROUP=`echo $LINE | cut -d ";" -f 4`
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
done < $DATABASE
IFS=${IFSold}
echo "OK"
exit 0
चूंकि अनुमतियाँ जानकारी एक समय में एक पंक्ति होती है, इसलिए मैं IFS को $ में सेट करता हूं, इसलिए केवल पंक्ति विराम को नई चीजों के रूप में देखा जाता है।
मैंने पढ़ा कि यह IFS पर्यावरण चर को वापस उसी तरह सेट करना बहुत महत्वपूर्ण है जिस तरह से यह था! आप देख सकते हैं कि केवल सेपरेटर के रूप में $ छोड़ने पर शेल सत्र बुरी तरह से क्यों चल सकता है।