গিটের মধ্যে ফাইল এবং ডিরেক্টরিগুলির অনুমতিগুলি কীভাবে পুনরুদ্ধার করা যেতে পারে?


278

আমার গিট চেকআউট আছে সমস্ত ফাইলের অনুমতিগুলি গিটের মনে হয় যা হওয়া উচিত তার চেয়ে পৃথক তাই সেগুলি সমস্ত পরিবর্তিত হিসাবে প্রদর্শিত হয়।

ফাইলগুলির বিষয়বস্তু স্পর্শ না করে (কেবলমাত্র অনুমতিগুলি সংশোধন করতে চাই) আমি কীভাবে সমস্ত ফাইলের অনুমতি সেট করব যা গিট মনে করে যে সেগুলি হওয়া উচিত?


উত্তর:


572

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

  1. একটি বিপরীত প্যাচ তৈরি করুন
  2. শুধুমাত্র অনুমতি পরিবর্তন অন্তর্ভুক্ত
  3. প্যাচটি আমাদের ওয়ার্কিং কপির সাথে প্রয়োগ করুন

ওয়ান-লাইনার হিসাবে:

git diff -p -R --no-ext-diff --no-color \
    | grep -E "^(diff|(old|new) mode)" --color=never  \
    | git apply

আপনি এটিকে আপনার গিট কনফিগারেশনে একটি উপস্ব হিসাবে যুক্ত করতে পারেন ...

git config --global --add alias.permission-reset '!git diff -p -R --no-ext-diff --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply'

... এবং আপনি এটির মাধ্যমে আবেদন করতে পারেন:

git permission-reset

দ্রষ্টব্য, আপনি যদি শেল হন তবে আশেপাশের উদ্ধৃতিগুলির পরিবর্তে bashব্যবহারের বিষয়টি নিশ্চিত করুন , অন্যথায় এটি আপনার চালানো শেষ কমান্ডের সাথে প্রতিস্থাপিত হয় ।'"!gitgit

থিক্স টু @ মিক্সলজিকটি নির্দেশ করার জন্য যে কেবল ব্যবহার -Rকরে git diff, জটিল sedকমান্ডের আর প্রয়োজন হয় না।


3
আমি ওএস এক্স এ আছি, এটি কাজ করছে না। আমি চিহ্নিত করেছি সমস্যাটি গিট প্রয়োগের মধ্যে রয়েছে। এটি ফাইলের অনুমতি পরিবর্তনগুলি প্রয়োগ করে না।
গোলমরিচ_চিকো

15
ওহ, এটি কাজ করেছিল, আমি সংগ্রহস্থলের মূল থেকে আলাদা কোনও ডিরেক্টরি থেকে প্রয়োগ করার চেষ্টা করছিলাম। গিট প্রয়োগ কেবল সেখানে কাজ করে।
মরিচ_চিকো

6
এর কোনও কারণ আছে যে আপনি সেডের বিপরীতে পরিণত না করে কেবল "গিট ডিফ-পি-আর" করতে চান?
মিশ্রোলজিক

6
@RobQuist আমার স্থানীয় পরিবর্তনগুলি সরানো হয়নি যখন muhqu এর কমান্ড ব্যবহার করে
logion

17
আমি পাচ্ছিfatal: unrecognized input
টাইমে

120

চেষ্টা git config core.fileMode false

থেকে git configমানুষ পৃষ্ঠা:

core.fileMode

যদি মিথ্যা হয় তবে সূচক এবং কার্যকরী অনুলির মধ্যে সম্পাদনযোগ্য বিট পার্থক্য উপেক্ষা করা হবে; FAT এর মতো ভাঙ্গা ফাইল সিস্টেমে দরকারী। দেখুন Git-আপডেট-সূচক (1)

ডিফল্টটি সত্য, গিট-ক্লোন (1) বা গিট-থার (1) ব্যতীত প্রোপোজ করা হবে এবং কোরের জন্য সেট করা হবে appropriate


ধন্যবাদ, আমি এটাই শেষ করেছি। অনুমোদনের ট্র্যাকিং না করে সিভিতে খুব ব্যবহৃত হয় তাই এটি কাজ করে।
ডেল ফরেস্টার

3
@ শোভাস: আমি আনন্দিত যে এটি সাহায্য করেছে। লিনাক্স এবং উইন্ডোজের মধ্যে রেপো ভাগ করে নেওয়ার সময় আমি একই ধরণের সমস্যাটি অনুভব করেছি। বিটিডাব্লু: যদি এটি আপনার প্রশ্নের উত্তর দেয় তবে দয়া করে প্রতিক্রিয়াটিকে সঠিক হিসাবে চিহ্নিত করুন।
টিম হেনিগান

এটি কি সম্ভব যে git checkout origin/masterআমার স্থানীয় ওয়ার্কিং কপির সাথে সার্ভারের কাছে প্রতিশ্রুতিবদ্ধ ফাইলের অনুমতি সেট করে? কারণ আমি যখনই আরানগোডিবি-এর জন্য ভি 8 তৈরি করি তখন ফাইলের অনুমতিগুলি পরিবর্তিত হয় যাতে পুরো বিল্ড ফোল্ডারে অ্যাক্সেস অস্বীকার করা হয় (এমনকি উন্নত অধিকার সহ; উইন্ডোজ ++ যা এটি)। বিল্ড প্রক্রিয়াটি চালিয়ে যাওয়ার আগে আমাকে সমস্ত স্থানীয় ফাইল অনুমতিগুলি ঠিক করতে হবে। core.filemode falseসেটাও ঠিক করতে পারবেন ? আমি আমার উইন্ডোজ মেশিনে লিনাক্সের অনুমতি সেট করতে গিটকে সন্দেহ করি। বিল্ড স্ক্রিপ্টগুলি কেবল সেগুলি সংরক্ষণ করে এবং নতুন নির্মিত ফাইলগুলিতে একই অনুমতিগুলি প্রয়োগ করতে পারে ...
CodeManX

আমি ভাবছি সেট filemodeকরার কোনও খারাপ দিক আছে কিনা false!
কেভেরয়েড

11

গিট এক্সিকিউটেবল স্ক্রিপ্টগুলি ছাড়া অন্য ফাইল অনুমতি সংরক্ষণ করে না। ফাইলের মালিকানা এবং অনুমতিগুলি সংরক্ষণ করতে গিট-ক্যাশে-মেটা জাতীয় কিছু ব্যবহার বিবেচনা করুন ।

গিটটি কেবল দুটি ধরণের মোড সঞ্চয় করতে পারে: 755 (এক্সিকিউটেবল) এবং 644 (এক্সিকিউটযোগ্য নয়)। আপনার ফাইলটি 444 গিট থাকলে এটিতে 644 থাকে।


14
দুঃখিত, তবে এটি ভুল। গিট সত্যই অনুমতিগুলি ট্র্যাক করে।
হবে

4
এটি মোটামুটি সঠিক, git.wiki.kernel.org/index.php/ContentLimitations দেখুন । সেট হয়ে যাওয়ার সঠিক অনুমতিগুলি সার্ভার এবং সম্ভবত ক্লায়েন্টের umaskপাশাপাশি একটি কনফিগার সেটিংসের উপর ভিত্তি করে প্রদর্শিত হয় , stackoverflow.com/a/12735291/125150 দেখুন
মোটি স্ট্রোম

12
@ উইল না, এটি হয় না। বিশ্বাস করতে পারছি না আপনার মন্তব্যে এতগুলি উপার্জন হয়েছে।
eis

@ উইল, এটি মোটামুটি সঠিক। প্রতি ডক্স ...a mode of 100644, which means it’s a normal file. Other options are 100755, which means it’s an executable file; and 120000, which specifies a symbolic link. The mode is taken from normal UNIX modes but is much less flexible — these three modes are the only ones that are valid for files (blobs) in Git (although other modes are used for directories and submodules).
esmail

9
git diff -p \
| grep -E '^(diff|old mode|new mode)' \
| sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
| git apply

বেশিরভাগ ক্ষেত্রেই কাজ করবে তবে যদি আপনার কাছে মেল্ট ইনস্টলের মতো বাহ্যিক ডিফ সরঞ্জাম রয়েছে তবে আপনাকে --no-ext-diff যুক্ত করতে হবে

git diff --no-ext-diff -p \
    | grep -E '^(diff|old mode|new mode)' \
    | sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
    | git apply

আমার পরিস্থিতিতে প্রয়োজন ছিল



0

আমি উইন্ডোজে সাইগউইনের কাছ থেকে গিট ব্যবহার করি, git applyসমাধানটি আমার পক্ষে কার্যকর হয় না। এখানে আমার সমাধান, chmodপ্রতিটি ফাইলের অনুমতিগুলি পুনরায় সেট করতে চালান ।

#!/bin/bash
IFS=$'\n'
for c in `git diff -p |sed -n '/diff --git/{N;s/diff --git//g;s/\n/ /g;s# a/.* b/##g;s/old mode //g;s/\(.*\) 100\(.*\)/chmod \2 \1/g;p}'`
do
        eval $c
done
unset IFS


-1

git diff -pমুহকের উত্তরে ব্যবহৃত সমস্ত ত্রুটিগুলি নাও দেখাতে পারে।

  • আমার নিজের হাতে থাকা ফাইলগুলির জন্য এটি সাইগউইনে দেখেছিলেন
  • মোড পরিবর্তন সম্পূর্ণরূপে উপেক্ষা করা হয় যদি core.filemodeহয় false(যা MSysGit জন্য ডিফল্ট হয়)

এই কোডটি পরিবর্তে সরাসরি মেটাটাটা পড়ে:

(set -o errexit pipefail nounset;
git ls-tree HEAD -z | while read -r -d $'\0' mask type blob path
do
    if [ "$type" != "blob" ]; then continue; fi;
    case "$mask" in
    #do not touch other bits
    100644) chmod a-x "$path";;
    100755) chmod a+x "$path";;
    *) echo "invalid: $mask $type $blob\t$path" >&2; false;;
    esac
done)

একটি অ-উত্পাদন-গ্রেড ওয়ান-লাইনার (সম্পূর্ণরূপে মুখোশগুলি প্রতিস্থাপন করে):

git ls-tree HEAD | perl -ne '/^10(0\d{3}) blob \S+\t(.+)$/ && { system "chmod",$1,$2 || die }'

("$ '\ 0'" এর ক্রেডিট http://transnum.blogspot.ru/2008/11/bashs-read-built-in-supports-0-as.html এ যায় )


-2

সবচেয়ে সহজ কাজটি হ'ল কেবল ফিরে অনুমতিগুলি পরিবর্তন করা। @ ক্রোগার হিসাবে চিহ্নিত গিটটি কেবল এক্সিকিউটেবল বিটগুলি ট্র্যাক করে। সুতরাং আপনার সম্ভবত এটি chmod -x filenameঠিক করার জন্য চালানো দরকার (বা +xযদি এটি প্রয়োজন হয় তবে)।


এখানে থেকে একটি উদাহরণ git show: DIFF --git A / OpenWatch / src / সংস্থা / বীয়ার / openwatch / FB / FBUtils.java বি / OpenWatch / src / সংস্থা / বীয়ার / openwatch / FB / FBUtils.java সূচক cd6fa6a..e5b0935 100644 যে কিছুটা সাহসিকতায় ফাইল অনুমতি রয়েছে is
কনরাডো

এটি আমার কাছেও সবচেয়ে সহজ মনে হয়েছিল। দুর্ভাগ্যবশত, আমি Conrado হিসাবে একই সমস্যার সম্মুখীন হয়েছি - আমি কাছ থেকে অনুমতি পরিবর্তন করতে পারিনি 100644করতে 100755। আমি মনে করি না যে আপনি একটি ডাউনটাভেটের যোগ্য; গিট ডাউন ভোট দেওয়া উচিত। এটি
এতগুলি

-2

etckeeperটুল অনুমতি ও সঙ্গে হ্যান্ডেল করতে পারেন:

etckeeper init -d /mydir

আপনি এটি অন্য ডায়ারের জন্য ব্যবহার করতে পারেন /etc

আপনার প্যাকেজ পরিচালক ব্যবহার করে ইনস্টল করুন বা উপরের লিঙ্ক থেকে উত্স পান।


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