Git के साथ फ़ाइल अनुमतियों को पुनः प्राप्त करना


109

मैं अपने वेब सर्वर के रूप में वर्णित में संस्करण को नियंत्रित करना चाहता हूं संस्करण को अपने वेब सर्वर के लिए नियंत्रित करना चाहता हूं, मेरे द्वारा जीआईटी रेपो बनाकर /var/www directory। मेरी आशा थी कि मैं तब अपने देव सर्वर से गितुब तक वेब सामग्री को आगे बढ़ा सकूंगा, इसे हमारे उत्पादन सर्वर तक खींच सकूंगा, और शेष दिन पूल में बिताऊंगा।

जाहिरा तौर पर मेरी योजना में यह है कि Git फ़ाइल अनुमतियों का सम्मान नहीं करेगा (मैंने इसे आज़माया नहीं है, केवल इसके बारे में अभी पढ़ रहा है।) मुझे लगता है कि यह समझ में आता है कि विभिन्न बॉक्स अलग-अलग उपयोगकर्ता / समूह सेटअप के लिए उत्तरदायी हैं। लेकिन अगर मैं प्रचार के लिए अनुमति देना चाहता हूं, तो यह जानकर कि मेरे सर्वर समान हैं, क्या मेरे पास कोई विकल्प है? या वहाँ एक आसान तरीका है कि मैं क्या करने की कोशिश कर रहा हूं?



1
हां, ऐसा लगता है, हालांकि वे जिस समाधान की ओर इशारा करते हैं मैं स्पष्ट रूप से निश्चित नहीं हूं कि क्या करना है। अधिक सीधे दृष्टिकोण की उम्मीद कर रहा था।
यारिन

उस स्थिति के बारे में क्या है जहां स्रोत कोड देव वातावरण (जैसे विंडोज - एक्सएएमपीपी आदि) से आ रहा है जिसमें फ़ाइल स्वामित्व जानकारी नहीं है? गिट प्रक्रिया के अंत में मौजूद फाइलों को लक्ष्य स्थान के लिए स्वामित्व और अनुमतियों से मेल खाना चाहिए। क्या git-cache-meta इससे निपट सकती है? यारिन से सहमत ... निश्चित रूप से यह एक बहुत ही मुख्यधारा का उपयोग मामला है, जिसमें एक बहुत ही सीधा समाधान होना चाहिए?
user3600150

जवाबों:


43

git-cache-metaतो सवाल में उल्लेख किया है " Git - कैसे फाइल अनुमति Git सोचता फ़ाइल होना चाहिए ठीक करने के लिए? " (और Git पूछे जाने वाले प्रश्न ) अधिक staightforward दृष्टिकोण है।

विचार एक .git_cache_metaफ़ाइल में फ़ाइलों और निर्देशिकाओं की अनुमतियों को संग्रहीत करने के लिए है।
यह एक अलग फाइल है जिसे सीधे जीआईटी रेपो में संस्करणित नहीं किया गया है।

यही कारण है कि इसके लिए उपयोग है:

$ git bundle create mybundle.bdl master; git-cache-meta --store
$ scp mybundle.bdl .git_cache_meta machine2: 
#then on machine2:
$ git init; git pull mybundle.bdl master; git-cache-meta --apply

तो तुम:

  • अपने रेपो को बंडल करें और संबंधित फ़ाइल अनुमतियों को सहेजें।
  • उन दो फ़ाइलों को दूरस्थ सर्वर पर कॉपी करें
  • रेपो को वहां पुनर्स्थापित करें, और अनुमति लागू करें

2
वॉन- इसके लिए धन्यवाद, मैं इसे आज़माऊंगा- लेकिन क्या बंडलिंग जरूरी है? क्या मैं अपने वर्कफ़्लो (देव -> जीथब -> प्रोडक्शन) को बरकरार नहीं रख सका और मेटाफ़ाइल चेकआउट / चेकआउट कर पाया?
यारिन

@ यरीन: नहीं, बंडल अनिवार्य नहीं है। यह रेपो को स्थानांतरित करने का एक अच्छा तरीका है जब कोई अन्य हस्तांतरण प्रोटोकॉल उपलब्ध नहीं है।
वॉनसी

3
यहां बंडल का उपयोग मेरे लिए एक बड़ी व्याकुलता थी। इसने मुझे जवाब पूरी तरह से बंद कर दिया। (मुझे सर्वर से रेपो को खींचने में कठिनाई नहीं है।) पूर्व / पोस्ट कमिट हुक के साथ नीचे @ omid-ariyan का उत्तर बहुत अधिक समझने योग्य था। बाद में मुझे महसूस हुआ कि वो हुक स्क्रिप्ट git-cache-meta जैसा ही काम कर रही है। जाओ देख मैं क्या मतलब है: gist.github.com/andris9/1978266 । वे पार्सिंग कर रहे हैं और रिटर्न जमा कर रहे हैं git ls-files
pauljohn32

Git-cache-meta का लिंक मर चुका है - क्या कोई व्यक्ति जो इसके बारे में जानता है वह इसका पता लगा सकता है और पोस्ट को संपादित कर सकता है?
रासुव

@rosuav ज़रूर: मैंने जवाब को संपादित किया है और लिंक को पुनर्स्थापित किया है। मुझे इस मृत लिंक के बारे में बताने के लिए धन्यवाद।
VONC

63

सॉफ्टवेयर विकास के लिए Git संस्करण नियंत्रण प्रणाली है, इसलिए मोड और अनुमतियों के पूरे सेट से यह केवल निष्पादन योग्य बिट (साधारण फ़ाइलों के लिए) और सिमलिंक बिट को संग्रहीत करता है। यदि आप पूर्ण अनुमतियाँ संग्रहीत करना चाहते हैं, तो आपको तीसरे पक्ष के उपकरण की आवश्यकता होती है, जैसे git-cache-meta( VonC द्वारा उल्लिखित ), या मेटास्टोर ( etckeeper द्वारा उपयोग किया जाता है )। या आप IsiSetup का उपयोग कर सकते हैं , जो IIRC बैकेंड के रूप में गिट का उपयोग करता है।

गिट विक पर इंटरफेसेस, फ्रंटेंड और टूल्स पेज देखें ।


2
धन्यवाद जैकब- क्या आप मुझे समझा सकते हैं कि Git को निष्पादन योग्य बिट और केवल उसी के बारे में क्यों परवाह है?
यारिन

5
@ यारिन: केवल निष्पादन योग्य बिट? जब आप एक सिस्टम से दूसरे सिस्टम में फ़ाइलों का एक पूरा सेट क्लोन करते हैं, तो "केवल पढ़ने के लिए" या "रीड-राइट" की धारणा बिल्कुल प्रासंगिक नहीं है (जैसा कि आपने अपने प्रश्न में कहा था: विभिन्न उपयोगकर्ताओं / समूहों)। लेकिन "निष्पादन योग्य" की धारणा उपयोगकर्ताओं और समूहों पर निर्भर नहीं करती है और सिस्टम से (दूरस्थ) सिस्टम में पुन: उपयोग की जा सकती है।
वॉन

1
Jakub, उस स्थिति में इसे अनुमतियाँ नहीं बदलनी चाहिए । मेरा मतलब है, इसे केवल परमिट छोड़ना चाहिए या उन्हें प्रबंधित करना चाहिए, लेकिन उनके साथ गड़बड़ न करें अगर यह उन्हें प्रबंधित करने के लिए नहीं जा रहा है।
कॉममाटॉस्ट

3
इसके अतिरिक्त, मैंने /usr/share/git-core/contrib/hooks/setgitperms.perlअपने git-contribपैकेज में पाया है- एक समान उद्देश्य के लिए एक स्क्रिप्ट। ("इस स्क्रिप्ट का उपयोग किसी कार्यशील पेड़ के भीतर पूर्ण अनुमतियों और स्वामित्व डेटा को बचाने / पुनर्स्थापित करने के लिए किया जा सकता है।")
imz - Ivan Zakharyaschev

क्या यह अभी भी सटीक है या जीथब किसी तरह गिट के शीर्ष पर कुछ करता है? मैंने सिर्फ एक फाइल को एक्जीक्यूटेबल में बदल दिया और उसे कमिट कर दिया, और कमिटमेंट के लिए चैंज को फाइल के लिए 0 लाइन के रूप में दिखाता है, लेकिन फाइलनेम के पास 100644 → 100755 है। यह वास्तव में ऐसा लगता है कि फ़ाइल के साथ पूर्ण अनुमतियाँ संग्रहीत हैं।
क्रंचर

23

यह काफी देर हो चुकी है लेकिन कुछ अन्य लोगों की मदद कर सकती है। मैं वही करता हूं जो आप मेरे रिपॉजिटरी में दो गिट हुक जोड़कर करना चाहते हैं।

.git / हुक / पूर्व प्रतिबद्ध:

#!/bin/bash
#
# A hook script called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if it wants
# to stop the commit.

SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions

# Clear the permissions database file
> $DATABASE

echo -n "Backing-up permissions..."

IFS_OLD=$IFS; IFS=$'\n'
for FILE in `git ls-files --full-name`
do
   # Save the permissions of all the files in the index
   echo $FILE";"`stat -c "%a;%U;%G" $FILE` >> $DATABASE
done

for DIRECTORY in `git ls-files --full-name | xargs -n 1 dirname | uniq`
do
   # Save the permissions of all the directories in the index
   echo $DIRECTORY";"`stat -c "%a;%U;%G" $DIRECTORY` >> $DATABASE
done
IFS=$IFS_OLD

# Add the permissions database file to the index
git add $DATABASE -f

echo "OK"

.git / हुक / उत्तर चेकआउट:

#!/bin/bash

SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions

echo -n "Restoring permissions..."

IFS_OLD=$IFS; IFS=$'\n'
while read -r LINE || [[ -n "$LINE" ]];
do
   ITEM=`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/directory permissions
   chmod $PERMISSIONS $ITEM

   # Set the file/directory owner and groups
   chown $USER:$GROUP $ITEM

done < $DATABASE
IFS=$IFS_OLD

echo "OK"

exit 0

पहला हुक तब कहा जाता है जब आप "कमिट" करते हैं और रिपॉजिटरी में सभी फाइलों के स्वामित्व और अनुमतियों को पढ़ेंगे और उन्हें रिपॉजिटरी नामक रूट में एक फाइल में स्टोर करते हैं।

दूसरा हुक तब कहा जाता है जब आप "चेकआउट" करते हैं और .permissions फ़ाइल में फ़ाइलों की सूची के माध्यम से जाएंगे और उन फ़ाइलों के स्वामित्व और अनुमतियों को पुनर्स्थापित करेंगे।

  • आपको sudo का उपयोग करके कमिट और चेकआउट करने की आवश्यकता हो सकती है।
  • सुनिश्चित करें कि प्री-कमिट और पोस्ट-चेकआउट स्क्रिप्ट के निष्पादन की अनुमति है।

ओमिद ... शुक्रिया! मैंने पाया कि आपका कोड मेरे लिए एक सही समाधान है।
Ricalsin

@Ricalsin आपका बहुत स्वागत है! मुझे खुशी है कि मैंने मदद की :) :)
ओमिड एरियन जूल

1
$SELF_DIR/../../जरूरी नहीं कि भंडार की जड़ ... लेकिन git rev-parse --show-toplevelहै। (यह निश्चित नहीं है कि आप केवल pwdवर्तमान निर्देशिका के लिए उपयोग क्यों नहीं करेंगे , लेकिन यह वैसे भी मूट है।)
PJSCopeland

जैसा कि यह खड़ा है, उपरोक्त उन में रिक्त स्थान के साथ फ़ाइल नामों को विभाजित करेगा। इस उत्तर के अनुसार , आप इसे रोकने के IFS=$'\n'लिए forलूप से पहले सेट कर सकते हैं (और unset IFSबाद में सुरक्षित रहने के लिए)।
PJSCopeland

यह आसानी से आपको एक भिन्न OS के साथ, जहां आपके पास एक अलग उपयोगकर्ता नाम है, किसी अन्य सिस्टम के लिए अनुमतियाँ ले जाने की अनुमति नहीं देता है। मैंने खुद से पूछा "मुझे वास्तव में क्या चाहिए?" और करने के लिए पूरे समाधान कटौती chmod 0600 .pgpassमें post-checkout। हां, जब भी मेरे पास कोई फ़ाइल होगी जिसे विशेष अनुमतियों की आवश्यकता होगी, तो मुझे इसे मैन्युअल रूप से अपडेट करना होगा।
PJSCopeland 4

2

यदि आप अभी इस मामले में आ रहे हैं, तो मैं आज ही इसके माध्यम से आया हूं और संक्षेप में बता सकता हूं कि यह कहां खड़ा है। यदि आपने अभी तक यह कोशिश नहीं की है, तो यहां कुछ विवरण मदद कर सकते हैं।

मुझे लगता है कि @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 पर्यावरण चर को वापस उसी तरह सेट करना बहुत महत्वपूर्ण है जिस तरह से यह था! आप देख सकते हैं कि केवल सेपरेटर के रूप में $ छोड़ने पर शेल सत्र बुरी तरह से क्यों चल सकता है।


2

हम .permissionsनिष्पादन योग्य होने के लिए फ़ाइल के प्रारूप को बदलकर chmod, और -printfपैरामीटर का उपयोग करने के लिए अन्य उत्तरों पर सुधार कर सकते हैं find। यहाँ सरल .git/hooks/pre-commitफ़ाइल है:

#!/usr/bin/env bash

echo -n "Backing-up file permissions... "

cd "$(git rev-parse --show-toplevel)"

find . -printf 'chmod %m "%p"\n' > .permissions

git add .permissions

echo done.

... और यहाँ सरलीकृत .git/hooks/post-checkoutफ़ाइल है:

#!/usr/bin/env bash

echo -n "Restoring file permissions... "

cd "$(git rev-parse --show-toplevel)"

. .permissions

echo "done."

याद रखें कि अन्य उपकरण पहले से ही इन लिपियों को कॉन्फ़िगर कर सकते हैं, इसलिए आपको उन्हें एक साथ मिलाने की आवश्यकता हो सकती है। उदाहरण के लिए, यहां एक post-checkoutस्क्रिप्ट है जिसमें git-lfsकमांड भी शामिल हैं :

#!/usr/bin/env bash

echo -n "Restoring file permissions... "

cd "$(git rev-parse --show-toplevel)"

. .permissions

echo "done."

command -v git-lfs >/dev/null 2>&1 || { echo >&2 "\nThis repository is configured for Git LFS but 'git-lfs' was not found on you
r path. If you no longer wish to use Git LFS, remove this hook by deleting .git/hooks/post-checkout.\n"; exit 2; }
git lfs post-checkout "$@"

1

प्री-कमिट / पोस्ट-चेकआउट में एक विकल्प "mtree" (FreeBSD), या "fmtree" (उबंटू) उपयोगिता का उपयोग करना होगा जो "किसी विनिर्देश के खिलाफ फ़ाइल पदानुक्रम की तुलना करता है, एक फ़ाइल पदानुक्रम के लिए एक विनिर्देश बनाता है, या एक को संशोधित करता है" विनिर्देश। "

डिफ़ॉल्ट सेट झंडे, gid, लिंक, मोड, nlink, आकार, समय, प्रकार और uid हैं। यह -k स्विच के साथ विशिष्ट उद्देश्य के लिए लगाया जा सकता है।


1

मैं FreeBSD 11.1 पर चल रहा हूं, freebsd जेल वर्चुअलाइजेशन अवधारणा ऑपरेटिंग सिस्टम को इष्टतम बनाती है। Git I का वर्तमान संस्करण 2.15.1 उपयोग कर रहा है, मैं शेल स्क्रिप्ट पर सब कुछ चलाना पसंद करता हूं। इस बात को ध्यान में रखते हुए मैंने उपरोक्त सुझावों को संशोधित किया:

git पुश: .it / हुक / प्री-कमिट

#! /bin/sh -
#
# A hook script called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if it wants
# to stop the commit.

SELF_DIR=$(git rev-parse --show-toplevel);
DATABASE=$SELF_DIR/.permissions;

# Clear the permissions database file
> $DATABASE;

printf "Backing-up file permissions...\n";

OLDIFS=$IFS;
IFS=$'\n';
for FILE in $(git ls-files);
do
   # Save the permissions of all the files in the index
    printf "%s;%s\n" $FILE $(stat -f "%Lp;%u;%g" $FILE) >> $DATABASE;
done
IFS=$OLDIFS;

# Add the permissions database file to the index
git add $DATABASE;

printf "OK\n";

git पुल: .it / हुक / पोस्ट-मर्ज

#! /bin/sh -

SELF_DIR=$(git rev-parse --show-toplevel);
DATABASE=$SELF_DIR/.permissions;

printf "Restoring file permissions...\n";

OLDIFS=$IFS;
IFS=$'\n';
while read -r LINE || [ -n "$LINE" ];
do
   FILE=$(printf "%s" $LINE | cut -d ";" -f 1);
   PERMISSIONS=$(printf "%s" $LINE | cut -d ";" -f 2);
   USER=$(printf "%s" $LINE | cut -d ";" -f 3);
   GROUP=$(printf "%s" $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=$OLDIFS

pritnf "OK\n";

exit 0;

यदि किसी कारण से आपको स्क्रिप्ट को फिर से बनाने की आवश्यकता है।

.gitignore;644;0;0

रूट: पहिया को दी गई 644 अनुमतियों के साथ .gitignore फ़ाइल के लिए

सूचना मुझे स्टेटमेंट विकल्पों में कुछ बदलाव करने थे।

का आनंद लें,


1

@Omid एरियन के जवाब के अलावा एक निर्देशिका पर अनुमति है। उसकी स्क्रिप्ट में forलूप के बाद इसे जोड़ें ।donepre-commit

for DIR in $(find ./ -mindepth 1 -type d -not -path "./.git" -not -path "./.git/*" | sed 's@^\./@@')
do
    # Save the permissions of all the files in the index
    echo $DIR";"`stat -c "%a;%U;%G" $DIR` >> $DATABASE
done

यह निर्देशिका अनुमतियों को भी बचाएगा।

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