আমি কীভাবে গিটকে উপেক্ষা করে ফাইল মোড (chmod) পরিবর্তন করব?


2308

আমার একটি প্রকল্প রয়েছে যেখানে chmodবিকাশের সময় আমাকে ফাইলের মোডটি 777 এ পরিবর্তন করতে হবে, তবে যা মূল রেপোতে পরিবর্তন হওয়া উচিত নয়।

গিট উপরে উঠেছে chmod -R 777 .এবং পরিবর্তিত হিসাবে সমস্ত ফাইল চিহ্নিত করে। গিট ফাইলগুলিতে করা মোড পরিবর্তনগুলি উপেক্ষা করার কোনও উপায় আছে?


17
উইন্ডোতে উবুন্টুতে উইন্ডোজ + ব্যাশ-এ গিটের সাথে কাজ করার সময় এটি সহায়ক
এলাজার

4
যে কেউ সুনির্দিষ্ট আহ্বানের জন্য অনুমতি পরিবর্তনগুলি অগ্রাহ্য করতে চায় git diffএবং যার জন্য তাদের গিট কনফিগারেশন ফাইলগুলি পরিবর্তন করতে চায় না: আপনি জেডেরgit diff -G. প্রতি উত্তর এখানে ব্যবহার করতে পারেন ।
সাম্পাব্লুকুপার

উত্তর:


3818

চেষ্টা করুন:

git config core.fileMode false

থেকে Git-কনফিগ (1) :

core.fileMode
    Tells Git if the executable bit of files in the working tree
    is to be honored.

    Some filesystems lose the executable bit when a file that is
    marked as executable is checked out, or checks out a
    non-executable file with executable bit on. git-clone(1)
    or git-init(1) probe the filesystem to see if it handles the 
    executable bit correctly and this variable is automatically
    set as necessary.

    A repository, however, may be on a filesystem that handles
    the filemode correctly, and this variable is set to true when
    created, but later may be made accessible from another
    environment that loses the filemode (e.g. exporting ext4
    via CIFS mount, visiting a Cygwin created repository with Git
    for Windows or Eclipse). In such a case it may be necessary
    to set this variable to false. See git-update-index(1).

    The default is true (when core.filemode is not specified
    in the config file).

-cপতাকা এককালীন কমান্ড জন্য এই বিকল্পটি সেট ব্যবহার করা যেতে পারে:

git -c core.fileMode=false diff

এবং --globalপতাকাটি লগ ইন হওয়া ব্যবহারকারীর জন্য এটি ডিফল্ট আচরণ হিসাবে তৈরি করবে।

git config --global core.fileMode false

বিশ্বব্যাপী সেটিংয়ের পরিবর্তনগুলি বিদ্যমান সংগ্রহস্থলগুলিতে প্রয়োগ করা হবে না। অতিরিক্ত হিসাবে, git cloneএবং গিট গ্লোবাল কোর হিসাবে আলোচনা হিসাবে git initস্পষ্টভাবে রেপো কনফিগারেশনে সেট core.fileModeকরা trueহয়েছে।

সতর্কতা

core.fileModeসেরা অনুশীলন নয় এবং সাবধানে ব্যবহার করা উচিত। এই সেটিংটি কেবল সম্পাদনযোগ্য বিড মোডে এবং কখনই পড়ুন / লেখার বিটগুলিকে আচ্ছাদন করে না। অনেক ক্ষেত্রে আপনি মনে করেন আপনার এই সেটিংটি দরকার কারণ আপনি chmod -R 777আপনার সমস্ত ফাইলকে এক্সিকিউটেবল করে এমন কিছু করেছিলেন । তবে বেশিরভাগ প্রকল্পে বেশিরভাগ ফাইলের প্রয়োজন হয় না এবং সুরক্ষার কারণে কার্যকর করা উচিত নয়

এই ধরণের পরিস্থিতি সমাধানের যথাযথ উপায় হ'ল ফোল্ডারটি হ্যান্ডেল করা এবং পৃথকভাবে ফাইল ফাইলের অনুমতি সহ ফাইল করা:

find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \;  # Make files read/write

যদি আপনি এটি core.fileModeকরেন তবে খুব বিরল পরিবেশ ব্যতীত আপনাকে কখনও ব্যবহারের প্রয়োজন হবে না ।


203
আপনি যদি করেন তবে git config --global core.filemode falseআপনাকে কেবল সমস্ত বারের জন্য এটি করতে হবে।
গ্রেগ

13
আমি মামলাটি স্থির না করা পর্যন্ত এটি আমার পক্ষে কার্যকর হয়নি
ফাইলমোডের

8
@ তিশমা: গিট কনফিগারেশন বিভাগ এবং ভেরিয়েবলের নামগুলি ডকুমেন্টেশন অনুসারে সংবেদনশীল, কনফিগারেশন ফাইল বিভাগটি দেখুন , সুতরাং যদি উপরেরটি আপনার পক্ষে কাজ না করে তবে এটি অন্য কোনও কারণে ছিল।
গ্রেগ হিউগিল

11
@ ডনকুইক্সোট: git configকমান্ডটি সঠিক কনফিগারেশন ফাইলে সেটিংসটি লিখেছেন ( .git/configকেবলমাত্র বর্তমান সংগ্রহস্থলের জন্য, বা ~/.gitconfigযদি এটির সাথে ব্যবহৃত হয় --global)।
গ্রেগ হিউগিল

8
@ zx1986: এতে কিছু যায় আসে না। গিট কনফিগারেশন থেকে : "পরিবর্তনশীল নামগুলি কেস-সংবেদনশীল, ..."
গ্রেগ হিউগিল

277

কার্যকারী গাছের মোড পরিবর্তনটি পূর্বাবস্থায়িত করুন:

git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'\n' chmod -x

বা মিংডু-গিট এ

git diff --summary | grep  'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'\n' chmod +x
git diff --summary | grep  'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'\n' chmod -x

42
ওএস এক্স লায়নটিতে -d'\n'অংশটি বাদ দিন xargsকারণ এটি একটি অবৈধ যুক্তি (এবং প্রয়োজন নেই)।
পাস্কল

9
আপনি "chmod: opera + x '" পরে অপরিবর্তিত সম্পর্কে কোনও ত্রুটি উপেক্ষা করতে পারেন
কেসি ওয়াটসন

5
এটি কি আপ টু ডেট? আমি 'chmod: খুব অল্প কিছু যুক্তি'
মিংডব্লু

7
@ প্যাসাল @ পিমলোটক -d কোনও সাদা স্থানের পরিবর্তে ডিলিমিটারটিকে নতুনরেখা হিসাবে নির্দিষ্ট করে। বিএসডি xargs এর বিকল্প নেই, তবে পরিবর্তে আপনি আউটপুটটি পাইপ করতে পারেন tr '\n' '\0'এবং তারপরে -0NU কে ডিলিমেটার হিসাবে ব্যবহার করার জন্য আরগটিকে xargs ব্যবহার করতে পারেন।
মার্ক অফলিক

10
শীতল, trজিনিস কাজ! ওএসএক্সের জন্য এখানে সম্পূর্ণ কমান্ডটি রয়েছে:git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x
কে। মাইকেল আয়ে

135

আপনি যদি আপনার সমস্ত repos এর জন্য এই বিকল্পটি সেট করতে চান তবে --globalবিকল্পটি ব্যবহার করুন ।

git config --global core.filemode false

যদি এটি কাজ না করে আপনি সম্ভবত গিটের একটি নতুন সংস্করণ ব্যবহার করছেন তাই --addবিকল্পটি ব্যবহার করে দেখুন।

git config --add --global core.filemode false

আপনি যদি এটি - গ্লোবাল বিকল্প ব্যতীত চালনা করেন এবং আপনার কার্যক্ষম ডিরেক্টরি কোনও রেপো নয়, আপনি পাবেন

error: could not lock config file .git/config: No such file or directory

5
দেখে মনে হচ্ছে পরে জিআইটি ব্যবহার করেছে --add, যেমনটিgit config --add --global core.filemode false
এমগের্ট

14
যদি রেপোর লোকাল কনফিগারেশনটি ইতিমধ্যে ফাইলমোড = সত্য থাকে তবে গ্লোবাল কনফিগারেশন পরিবর্তন করা কার্যকর হবে না কারণ স্থানীয় কনফিগারেশন বিশ্বব্যাপী কনফিগারেশনকে ওভাররাইড করে। মেশিনের প্রতিটি রেপোর স্থানীয় কনফিগারেশন একবারে পরিবর্তন করতে হবে
রাকিব

3
অনুগ্রহ করে: এই উত্তরটি সিডরাকিবের সতর্কতার সাথে আপডেট করুন! আমি এটি সন্ধান করার আগে সমস্ত কিছু উন্মাদ অনুভূত হয়েছিল এবং এর পরে নির্ভুল জ্ঞান অর্জন করেছিল।
জার্কার্ক

88

যদি

git config --global core.filemode false

আপনার জন্য কাজ করে না, ম্যানুয়ালি এটি করুন:

cd into yourLovelyProject folder

.git ফোল্ডারে সিডি করুন:

cd .git

কনফিগার ফাইলটি সম্পাদনা করুন:

nano config

সত্য মিথ্যা যাও

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

সংরক্ষণ করুন, প্রস্থান করুন, উপরের ফোল্ডারে যান:

cd ..

গিট পুনরায়

git init

তুমি পেরেছ!


11
সম্পাদনার পরিবর্তে, আপনার প্রকল্পের মূলের মধ্যে .git/configএকটি সরল git config core.fileMode falseযথেষ্ট। আপনি যদি কনফিগার ফাইলটি সম্পাদনা করেন তবে আপনি পুরোপুরি দিকনির্দেশনাটি সরিয়ে ফেলার চেয়ে আরও ভাল, যাতে বিশ্বব্যাপী কোনওটি বেছে নেওয়া যায়।
ফেলিক্স

6
-1 যদি গিট কনফিগারেশন - গ্লোবাল এটির কাজ না করে তার মানে আপনার সিস্টেম স্তরে এটি করার অনুমতি globalনেই , অপসারণ অপশন হ'ল ম্যানুয়ালি সম্পাদনা করার মতো একই কাজ করে .git / config
চার্লসবি

@ চারেলসবি ভুল - উত্তরগুলি প্রকল্পটিতে নির্দিষ্ট করে বিকল্পটিকে সরাসরি প্রকল্পের মধ্যে ফেলে একটি কার্যনির্বাহী সরবরাহ করেছে। এটি ভবিষ্যতে আপনার তৈরি / চেকআউট করা অন্যান্য গিট প্রকল্পগুলির সাথে কাজ করবে না, তবে আপনি যে প্রকল্পে কাজ করছেন তার পক্ষে কাজ করে। (আসুন আমরা নিশ্চিত করি যে আমরা ~/.gitconfig~/project/.git/config
বিশৃঙ্খলা ছাড়াই

এটি একবার চালিত হয়ে গেলে git initকি আমাদের ফাইলমোডকে আবার সত্যে সেট করা উচিত?
জর্দান

53

যোগ করা হচ্ছে গ্রেগ Hewgill উত্তর (ব্যবহারের core.fileModeকনফিগ পরিবর্তনশীল):

আপনি সূচকটিতে এক্সিকিউটিভ অনুমতিগুলি পরিবর্তন করতে গিট আপডেট-ইনডেক্সের ("গিট অ্যাড" এর নিম্ন-স্তরের সংস্করণ) --chmod=(-|+)xবিকল্পটি ব্যবহার করতে পারেন , যেখান থেকে আপনি "গিট কমিট" ব্যবহার করেন (এবং "গিট কমিট-এ নয়" ")।


2
এটি পৃথক উত্তর হিসাবে যুক্ত করার পরিবর্তে গ্রেগ হিউগিলের উত্তরে সম্পাদিত হওয়া উচিত ছিল, এইভাবে একটি একক দ্ব্যর্থহীন উপস্থাপনা দিয়ে একটি সর্বোচ্চ উত্তর তৈরি করে।
গ্রেগ

6
@ গ্রেগ: নিজস্ব উত্তর না সম্পাদনা করার জন্য পর্যাপ্ত পয়েন্ট থাকা দরকার; আমার মনে হয় সেই সময়ে আমার কাছে সম্পাদনার অনুমতি দেওয়ার পক্ষে পর্যাপ্ত পরিমাণ ছিল না।
জাকুব নরবস্কি

1
@ জাকুব আমি মনে করি আপনার এখন যথেষ্ট খ্যাতি আছে :) উদাহরণস্বরূপ ফাইলটির জন্য এই আদেশটি কেমন হবে?
অ্যালেক্স হল

38

আপনি বিশ্বব্যাপী এটি কনফিগার করতে পারেন:

git config --global core.filemode false

যদি উপরেরগুলি আপনার পক্ষে কাজ করে না, কারণ আপনার স্থানীয় কনফিগারেশনটি বৈশ্বিক কনফিগারেশনকে ওভাররাইড করে।

বিশ্বব্যাপী কনফিগারেশন কার্যকর করতে আপনার স্থানীয় কনফিগারেশন সরান:

git config --unset core.filemode

বিকল্পভাবে, আপনি আপনার স্থানীয় কনফিগারেশনটি সঠিক মানে পরিবর্তন করতে পারেন:

git config core.filemode false


4
যদি মূল উত্তরটি আপনাকে সহায়তা না করে - এটি ব্যবহার করে দেখুন। আপনি যদি নিজের স্থানীয় কনফিগারেশনটি এটি সংশোধন না করে পরীক্ষা করতে চান তবে git config -l(বর্তমান কনফিগার তালিকা - স্থানীয় এবং বৈশ্বিক উভয়ই তালিকাভুক্ত করুন)
ক্রিজিসটফ বোসিউরকো

23

আপনি যদি ইতিমধ্যে chmod কমান্ড ব্যবহার করেছেন তবে ফাইলের পার্থক্য পরীক্ষা করুন, এটি পূর্ববর্তী ফাইল মোড এবং বর্তমান ফাইল মোড যেমন:

নতুন মোড: 755

পুরানো মোড: 644

নীচের কমান্ডটি ব্যবহার করে সমস্ত ফাইলের পুরানো মোড সেট করুন

sudo chmod 644 .

এখনই কমান্ড ব্যবহার করে বা ম্যানুয়ালি কনফিগারেশন ফাইলটিতে কোর.ফাইলমোডকে মিথ্যা হিসাবে সেট করুন।

git config core.fileMode false

তারপরে সমস্ত ফাইলের অনুমতি পরিবর্তন করতে chmod কমান্ড প্রয়োগ করুন

sudo chmod 755 .

এবং আবার core.fileMode টি সত্য হিসাবে সেট করে।

git config core.fileMode true

সেরা অনুশীলনের জন্য কোর.ফিলমোড সবসময় মিথ্যা রাখবেন না।


আপনি কি বলছেন যে একটি সম্পূর্ণ প্রকল্প (বিকাশ, মঞ্চায়ন এবং উত্পাদনে) 755 হওয়া উচিত?
ড্যানিয়েল

@ ড্যানিয়েল ফেব্রুয়ারি: না, কেবলমাত্র প্রয়োজনীয় ফাইলগুলির মোড পরিবর্তন করুন।
কিশোর ভিটেকার

For best practises don't Keep core.fileMode false alwaysআপনার অর্থ কী, আপনার এটি বোঝানো উচিত।
বিজি

For best practises don't Keep core.fileMode false always.কিছু ফাইল সিস্টেম (উদাহরণস্বরূপ FAT) ফাইল অনুমতি সমর্থন করে না, সুতরাং ওএস একটি ডিফল্ট মান (যেভাবেই আমার সিস্টেমে 766) প্রতিবেদন করবে। এই ক্ষেত্রে, core.filemodeস্থানীয় কনফিগারেশনে একেবারে প্রয়োজনীয়, যদি না আপনি অপ্রয়োজনীয় এবং অনিচ্ছাকৃত অনুমতি পরিবর্তনের মাধ্যমে প্রতিশ্রুতিবদ্ধ ইতিহাসটি
ফুটিয়ে তুলতে না চান

এছাড়াও, আপনি কেন একেবারে পার্মসগুলি পরিবর্তন করতে বিরক্ত করবেন? যদি আপনি সেট করেন core.filemode=falseতবে গিট বিট পরিবর্তনগুলি সম্পাদন করতে পারে, স্থানীয় অনুমতি পরিবর্তন করার দরকার নেই। আপনি যদি ইতিমধ্যে সূচকে অনুমতি পরিবর্তনগুলি না জুড়ে থাকেন, তবে সেক্ষেত্রে git addআপনি অফ করার পরে আপনার যে পদক্ষেপটি প্রয়োজন তা আপনি মিস করছেন core.filemode
কেভিনআর

18

নীচের উপনামটি নির্ধারণ করে (~ / .gitconfig) আপনি সহজেই অস্থায়ীভাবে ফাইল গেম প্রতি গিট কমান্ডটি অক্ষম করতে পারেন:

[alias]
nfm = "!f(){ git -c core.fileMode=false $@; };f"

যখন এই এলিফটি গিট কমান্ডের সাথে উপস্থাপিত হয়, তখন ফাইল মোড পরিবর্তনগুলি কমান্ডগুলিতে প্রদর্শিত হবে না যা অন্যথায় তাদের দেখায়। উদাহরণ স্বরূপ:

git nfm status

14

আপনি যদি কনফিগারেশন ফাইলগুলিতে পুনরাবৃত্তভাবে (সাবমডিউল সহ) ফাইলমোডকে মিথ্যাতে সেট করতে চান: find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'


4
যদি সেই লাইনটি কনফিগ ফাইলে না থাকে তবে এটি কাজ করবে না। আপনি যদি সাবমডিউলগুলির জন্য এটি পরিবর্তন করতে চান তবে এটি ব্যবহার করে দেখুন:git submodule foreach git config core.fileMode false
কোর্টল্যান্ডজ

4

সহজ সমাধান:

এই হিট সহজ কমান্ড প্রকল্পের ফোল্ডারে ( এটা আপনার মূল পরিবর্তনগুলি সরাতে হবে না) ... এটা শুধুমাত্র হবে পরিবর্তনগুলি সরাতে যে হয়েছে কাজ যখন আপনি পরিবর্তিত প্রকল্পের ফোল্ডারের অনুমতি

কমান্ড নীচে:

গিট কনফিগারেশন কোর.ফিলমড মিথ্যা

এই সমস্ত অপ্রয়োজনীয় ফাইলটি কেন সংশোধন করা হবে: কারণ আপনি প্রশংসিত sudo chmod -R 777। / আপনার প্রকল্প ফোল্ডার সহ প্রকল্প ফোল্ডারের অনুমতিগুলি পরিবর্তন করেছেন because

আপনি কি করেননি এমন পরিবর্তনগুলি কখন পরীক্ষা করবেন? গিট ডিফ ফাইল ফাইল ব্যবহার করার সময় আপনি নীচের মত দেখতে পেলেন

old mode 100644
new mode 100755

1

এটি আমার পক্ষে কাজ করে:

find . -type f -exec chmod a-x {} \;

বা বিপরীত, আপনার অপারেটিং সিস্টেমের উপর নির্ভর করে

find . -type f -exec chmod a+x {} \;

1
এটি ফাইলের অনুমতিগুলি পরিবর্তন করতে পারে তবে ফাইলটির ফাইল অনুমতিগুলিকে উপেক্ষা করবে না।
ডোমডামব্রোগিয়া

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