গিটের সাথে ফাইলের অনুমতি পুনরুদ্ধার করা


109

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

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



1
হ্যাঁ অনুমান, যদিও তারা যে সমাধানটি আমি দেখিয়েছে তা আমি স্পষ্টভাবে জানি না যে কী করব। আরও সহজ সরল পদ্ধতির জন্য আশা ছিল।
ইয়ারিন

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

উত্তর:


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
এখানে বান্ডিল ব্যবহার আমার জন্য একটি বড় বিড়ম্বনা ছিল। এটি আমাকে পুরোপুরি উত্তরটি ফেলে দিয়েছে, আসলে। (সার্ভার থেকে রেপো টানতে আমার অসুবিধা নেই)) @ ওমিড-আরিয়ানের নীচে প্রাক / পোস্ট কমিট হুক সহ উত্তরটি অনেক বেশি বোধগম্য ছিল। পরে আমি বুঝতে পারি যে এই হুক স্ক্রিপ্টগুলি গিট-ক্যাশে-মেটা হিসাবে ঠিক একই কাজ করছে। আমার অর্থটি দেখুন : gist.github.com/andris9/1978266 । তারা পার্সিং করছে এবং এখান থেকে ফিরে সংরক্ষণ করছে git ls-files
pauljohn32

গিট-ক্যাশে-মেটার লিঙ্কটি মারা গেছে - কে এই বিষয়ে জানে এমন কেউ এটি সনাক্ত করে পোস্টটি সম্পাদনা করতে পারে?
rouuav

@ ক্রুয়াভ শিওর: আমি উত্তরটি সম্পাদনা করেছি এবং লিঙ্কটি পুনরুদ্ধার করেছি। এই মৃত লিঙ্কটি আমাকে জানানোর জন্য আপনাকে ধন্যবাদ।
ভনসি

63

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

দেখুন ইন্টারফেস, frontends, এবং সরঞ্জাম গীত উইকি পৃষ্ঠার।


2
ধন্যবাদ জাকুব- আপনি কি আমাকে ব্যাখ্যা করতে পারবেন কেন গিট সম্পাদনযোগ্য বিট সম্পর্কে যত্নশীল এবং কেবল এটিই?
ইয়ারিন

5
@ ইয়্যারিন: কেবলমাত্র কার্যকর? আপনি যখন এক সিস্টেম থেকে অন্য সিস্টেমে সমস্ত সেট ফাইল ক্লোন করে ফেলেছেন, তখন "কেবল পঠনযোগ্য" বা "পঠন-লেখার" ধারণাটি ঠিক প্রাসঙ্গিক নয় (যেমন আপনি আপনার প্রশ্নে বলেছেন: বিভিন্ন ব্যবহারকারী / গোষ্ঠী)। তবে "এক্সিকিউটেবল" ধারণাটি ব্যবহারকারী এবং গোষ্ঠীর উপর নির্ভর করে না এবং এটি সিস্টেম থেকে (রিমোট) সিস্টেমে পুনরায় ব্যবহার করা যেতে পারে।
ভোনসি

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

3
অতিরিক্তভাবে, আমি /usr/share/git-core/contrib/hooks/setgitperms.perlআমার git-contribপ্যাকেজটিতে খুঁজে পেয়েছি - একই উদ্দেশ্যে একটি স্ক্রিপ্ট। ("এই স্ক্রিপ্টটি গিট ওয়ার্কিং
ট্রিে

এটি কি এখনও সঠিক বা গিথুব গিটের শীর্ষে কোনওভাবে কিছু করে? আমি কেবল একটি ফাইলকে সম্পাদনযোগ্য ও প্রতিশ্রুতিবদ্ধ হিসাবে পরিবর্তিত করেছি এবং প্রতিশ্রুতিবদ্ধতার জন্য চেঞ্জলগটি ফাইলের জন্য 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

প্রথম হুকটি ডাকা হয় যখন আপনি "প্রতিশ্রুতিবদ্ধ" হন এবং সংগ্রহস্থলের সমস্ত ফাইলের মালিকানা এবং অনুমতিগুলি পড়েন এবং সেগুলি .perifications নামক একটি সংগ্রহস্থলের মূলের একটি ফাইলে সংরক্ষণ করেন এবং তারপরে কমিটে .perifications ফাইল যুক্ত করুন।

দ্বিতীয় হুকটি যখন আপনি "চেকআউট" নামক কল করা হয় এবং .perifications ফাইলগুলিতে ফাইলগুলির তালিকার মধ্য দিয়ে যাবেন এবং সেই ফাইলগুলির মালিকানা এবং অনুমতিগুলি পুনরুদ্ধার করবেন।

  • Sudo ব্যবহার করে আপনার কমিট এবং চেকআউট করার দরকার হতে পারে।
  • নিশ্চিত করুন যে প্রাক কমিট এবং পোস্ট-চেকআউট স্ক্রিপ্টগুলির কার্যকর করার অনুমতি রয়েছে sure

ওমিড ... ধন্যবাদ! আমি আপনার কোডটি আমার পক্ষে একটি নিখুঁত সমাধান হিসাবে পেয়েছি।
রিকলসিন

@ রিকলসিন আপনি খুব স্বাগতম! আমি সাহায্য করে আনন্দিত :)
ওমিড আরিয়ান

1
$SELF_DIR/../../অগত্যা সংগ্রহস্থলের মূল নয় ... তবে git rev-parse --show-toplevelতা। (আপনি কেবলমাত্র pwdবর্তমান ডিরেক্টরি ব্যবহার করবেন না কেন তা নিশ্চিত নন তবে এটি যেভাবেই হোক
মোডে

এটি যেমন দাঁড়িয়েছে, উপরেরগুলি ফাইলের নামগুলিকে ফাঁকা করে আলাদা করবে। এই উত্তর হিসাবে , আপনি যে থামাতে লুপ IFS=$'\n'আগে সেট করতে পারেন for(এবং unset IFSপরে নিরাপদ হতে)।
পিজেএসকোপল্যান্ড

এটি সহজেই আপনাকে আলাদা সিস্টেমে, অন্য কোনও ওএস সহ, যেখানে আপনার পৃথক ব্যবহারকারীর নাম রয়েছে, অনুমতিগুলি বহন করার অনুমতি দেয় না। আমি নিজেকে জিজ্ঞাসা করলাম "আমার আসলে কী দরকার?" এবং সমগ্র সমাধান কেটে chmod 0600 .pgpassমধ্যে post-checkout। হ্যাঁ, যখনই আমার কাছে কোনও ফাইলের সুনির্দিষ্ট অনুমতি প্রয়োজন তবে আমি নিজে এটি আপডেট করব update
পিজেএসকোপল্যান্ড

2

আপনি যদি এই মুহুর্তে আসছেন তবে আমি আজই এটি পেরিয়েছি এবং সংক্ষিপ্তসারটি বলতে পারি যেখানে এটি দাঁড়িয়ে। আপনি যদি এখনও এটি চেষ্টা না করেন তবে এখানে কিছু বিশদ সহায়তা করতে পারে।

আমি মনে করি @ ওমিদ আরিয়ান এর পদ্ধতির সেরা উপায়। প্রাক কমিট এবং পোস্ট-চেকআউট স্ক্রিপ্টগুলি যুক্ত করুন। ওমিড যেভাবে তাদের নাম ঠিক রাখবেন তা ভুলে যাবেন না এবং এগুলি কার্যকর করতে ভুলে যাবেন না। আপনি যদি সেগুলির মধ্যে কোনওটি ভুলে যান তবে সেগুলির কোনও প্রভাব নেই এবং আপনি কেন কিছু ঘটছেন না তা ভেবে বার বার "গিট কমিট" চালান :) এছাড়াও, আপনি যদি ওয়েব ব্রাউজারটি কেটে পেস্ট করে ফেলে থাকেন তবে সতর্কতা অবলম্বন করুন যে উদ্ধৃতি চিহ্ন এবং টিকগুলি না রয়েছে বদলে দিয়েছিলেন।

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

ওমিডের স্ক্রিপ্টগুলিতে ফাইলের নামের ডিরেক্টরি নাম এবং স্পেসগুলির অস্তিত্ব সম্পর্কে কয়েকটি সামান্য সমস্যা রয়েছে। স্পেসগুলি এখানে সমস্যা ছিল এবং আইএফএস ফিক্স নিয়ে আমার কিছুটা সমস্যা হয়েছিল। রেকর্ডের জন্য, এই প্রাক কমিট স্ক্রিপ্টটি আমার পক্ষে সঠিকভাবে কাজ করেছে:

#!/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"

এখন, আমরা এ থেকে কি পেতে পারি?

.Perifications ফাইলটি গিট রেপুর শীর্ষ স্তরে রয়েছে। প্রতি ফাইলটিতে এটির একটি লাইন রয়েছে, এখানে আমার উদাহরণের শীর্ষস্থানীয়:

$ 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

সুতরাং আমি কেবল প্রথমটি রাখছি, এটাই আমার প্রয়োজন। ওয়েব সার্ভারে আমার ব্যবহারকারীর নাম প্রকৃতপক্ষে পৃথক, তবে আরও গুরুত্বপূর্ণ আপনি রুট না হলে আপনি ডাকা চালাতে পারবেন না। তবে "chgrp" চালাতে পারেন। এটি কীভাবে ব্যবহার করতে হয় তা যথেষ্ট সহজ is

এই পোস্টের প্রথম উত্তরে, যেটি বহুলভাবে গ্রহণযোগ্য, সেই পরামর্শটি তাই গিট-ক্যাশে-মেটা ব্যবহার করুন, একটি স্ক্রিপ্ট যা একই কাজ করছে যা এখানে প্রাক / পোস্ট হুক স্ক্রিপ্টগুলি করছে (আউটপুট পার্সিং থেকে git ls-files ) । এই স্ক্রিপ্টগুলি আমার পক্ষে বুঝতে সহজ, গিট-ক্যাশে-মেটা কোডটি বরং আরও বিস্তৃত। গিট-ক্যাশে-মেটা পথে রাখা সম্ভব এবং প্রাক-কমিট এবং পোস্ট-চেকআউট স্ক্রিপ্টগুলি এটি ব্যবহার করবে তা লিখতে পারে।

ফাইলের নামের ফাঁকা জায়গাগুলি ওমিডের দুটি স্ক্রিপ্টই সমস্যা। পোস্ট-চেকআউট স্ক্রিপ্টে, আপনি যদি জানাতে চান যে ফাইলের নামের মধ্যে ফাঁকা স্থান রয়েছে

$ 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

যেহেতু অনুমতিগুলির তথ্যগুলি একবারে একটি লাইন, তাই আমি আইএফএসকে $ এ সেট করেছিলাম, সুতরাং কেবল লাইন ব্রেকগুলিই নতুন জিনিস হিসাবে দেখা যায়।

আমি পড়েছি যে আইএফএস পরিবেশ পরিবর্তনশীলটিকে ঠিক সেভাবে সেট করা খুব গুরুত্বপূর্ণ! আপনি যদি দেখতে পান তবে শেল সেশনটি কেন খারাপভাবে যেতে পারে $ কেবলমাত্র পৃথককারী হিসাবে।


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

প্রাক-কমিট / পোস্ট-চেকআউটে একটি বিকল্প হ'ল "এমটি্রি" (ফ্রিবিএসডি), বা "fmtree" (উবুন্টু) ইউটিলিটি যা "কোনও নির্দিষ্টকরণের সাথে কোনও ফাইলের স্তরক্রমের সাথে তুলনা করে, একটি ফাইলের স্তরক্রমের জন্য একটি স্পেসিফিকেশন তৈরি করে, বা একটি সংশোধন করে স্পেসিফিকেশন। "

ডিফল্ট সেটটি হ'ল পতাকা, গ্রিড, লিঙ্ক, মোড, এনলিংক, আকার, সময়, প্রকার এবং uid। এটি -k সুইচ সহ নির্দিষ্ট উদ্দেশ্যে লাগানো যেতে পারে।


1

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

গিট পুশ: .git / হুকস / প্রাক কমিট

#! /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 / হুকস / পোস্ট-মার্জ

#! /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;

যদি কোনও কারণে আপনাকে স্ক্রিপ্টটি পুনরায় তৈরি করতে হয় তবে .perifications ফাইল আউটপুটে নিম্নলিখিত ফর্ম্যাটটি থাকা উচিত:

.gitignore;644;0;0

রুট: হুইলকে দেওয়া 644 অনুমতি সহ একটি .gitignore ফাইলের জন্য

লক্ষ্য করুন স্ট্যাট অপশনগুলিতে আমাকে কয়েকটি পরিবর্তন করতে হয়েছিল।

উপভোগ করুন,


1

@ ওমিদ আরিয়ানের উত্তরের একটি যোগ হ'ল ডিরেক্টরিতে অনুমতি। তার স্ক্রিপ্টে 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

এটি ডিরেক্টরি অনুমতি পাশাপাশি সংরক্ষণ করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.