উত্তর:
আপনি ব্যবহার করতে পারেন git filter-branch
যে জন্য, সঙ্গে --tree-filter
বিকল্প, এবং নির্দিষ্ট --all
শাখা জন্য।
এখানে একটি উদাহরণ রয়েছে (ইউনিক্স-প্রকারের পাঠ্য ফাইলটি দিয়ে খালি ডিরেক্টরিতে শুরু করা:
প্রস্তুতি:
$ hexdump -C testfile
00000000 61 0d 0a 62 0d 0a 63 0d 0a |a..b..c..|
00000009
$ git init
Initialized empty Git repository in /home/seigneur/tmp/a/.git/
$ git add testfile && git commit -m "dos file checked in"
[master (root-commit) df4970f] dos file checked in
1 files changed, 3 insertions(+), 0 deletions(-)
create mode 100644 testfile
আদেশ:
$ git filter-branch --tree-filter 'git ls-files -z | xargs -0 dos2unix' -- --all
আউটপুট:
Rewrite df4970f63e3196216d5986463f239e51eebb4014 (1/1)dos2unix: converting file testfile to Unix format ...
Ref 'refs/heads/master' was rewritten
$ hexdump -C testfile
00000000 61 0a 62 0a 63 0a |a.b.c.|
00000006
আমি দৃ strongly ়ভাবে আগে একটি সম্পূর্ণ ব্যাকআপ করার পরামর্শ দিচ্ছি । আপনার লিনাক্স মেশিন থেকে এটি চালানো (আপনার উইন্ডোজের পরিবেশে যদি আপনি একটি ভাল শেল সেটআপ না করেন) সম্ভবত এটি আরও সহজ।
সম্পাদনা করুন: রূপান্তরটি প্রথমবারের দিকে ফিরে গিয়েছিল।
git filter-branch --prune-empty --tree-filter 'git add --renormalize .' -- --all
মাদুরের উত্তরটি এই বিষয়টি সরাসরি মাথার উপরে ফেলেছে। দুর্ভাগ্যক্রমে উবুন্টু লিনাক্স-এ, সংস্করণ 10.04 (লুসিড লিংকস) দিয়ে শুরু করা, ডস 2 ইউনিক্স / ইউনিক্স 2 ডান কমান্ডগুলি আর উপলব্ধ নেই এবং fromdos / todos দ্বারা প্রতিস্থাপন করা হয়েছে। তদ্ব্যতীত, রূপান্তর কমান্ডের দুটি সেটই বাইনারি ফাইলগুলির অস্তিত্ব সম্পর্কে বিভিন্ন ধরণের অজ্ঞতা রয়েছে, সুতরাং যদি আপনার সংগ্রহস্থলে চিত্র, ফন্ট ইত্যাদি থাকে তবে তারা এই প্রক্রিয়াটি দ্বারা দূষিত হতে চলেছে।
আমি বাইনারি ফাইল দুর্নীতি ইস্যুটির জন্য একটি কাজের সন্ধান করতে পেরেছি যা কেবলমাত্র নীচের চিত্রের মতো টেক্সট ফাইলগুলি সঠিকভাবে সনাক্ত করতে এবং প্রক্রিয়া করার জন্য লিনাক্স 'ফাইল' কমান্ড ব্যবহার করে। নীচের কমান্ডটি নতুন ট্যাগগুলি নতুন সংশোধিত কমিটিতে স্থানান্তরিত করে বিদ্যমান ট্যাগগুলি সংরক্ষণ করার জন্য --tag-name-ফিল্টার বিকল্পটি ব্যবহার করে। এছাড়াও এটির আগেও --for পতাকা ব্যবহার করে তা নিশ্চিত করার জন্য কমান্ডটি আপনার সংগ্রহস্থলে ট্রি-ফিল্টার চালিয়েছে এমন পরিস্থিতিতে কাজ করবে।
git filter-branch --force --tree-filter 'git ls-files | xargs file | sed -n -e "/.*: .*text.*/s/\(.*\): .*/\1/p" | xargs fromdos' --tag-name-filter cat -- --all
এবং কোনও অতিরিক্ত সরঞ্জাম ছাড়াই (যেমন 'fromdos', 'ডস 2 ইউনিক্স' ইত্যাদি):
git filter-branch --force --tree-filter 'git ls-files | xargs file | sed -n -e "/.*: .*text.*/s/\(.*\): .*/\1/p" | xargs -0 sed -i"" -e "s/"$(printf "\015")"$//"' --tag-name-filter cat -- --all
ক্রসপ্ল্যাটফর্ম (ওএস এক্স, ফ্রিবিএসডি, লিনাক্স) দরকারী অ্যানালগ 'fromdos', 'ডস 2 ইউনিক্স':
sed -i'' -e 's/'"$(printf '\015')"'$//'
সম্ভবত দরকারী 'unix2dos':
sed -i '' -e 's|$|'"`printf '\015'`"'|' file.name
আপনি যদি অযৌক্তিকভাবে শিউর করছেন তবে আপনি কি করছেন, আপনি বর্তমান ডিরেক্টরিতে সমস্ত ফাইল থেকে "/ r" মুছে ফেলার জন্য এই সাধারণ ইনলাইন কমান্ডটি ব্যবহার করতে পারেন "।":
find . -type f -exec sed -i'' -e 's/'"$(printf '\015')"'$//' {} \;
sed
sed -n -e "s/\(.*\): .*text.*/\1/p"
git filter-branch --tree-filter 'git ls-files -z | xargs -0 dos2unix' -- --all
। পতাকা-z
এবং-0
বলুনgit ls-files
এবংxargs
মুদ্রণ এবংnull
লাইনের শেষ হিসাবে ব্যাখ্যা ।