সমস্ত সিআরএলএফকে এলএফ-তে প্রতিস্থাপনের জন্য গিটের ইতিহাস পুনরায় লিখুন?


32

আমি উইন 32 বক্স থেকে উবুন্টুতে একটি ব্যক্তিগত গিট সংগ্রহস্থল স্থানান্তর করতে যাচ্ছি। যদিও আমি একটি চূড়ান্ত ডস 2 ইউনিক্স কমিট করতে পারি তবে আমি পুরো ইতিহাসটি আবার লিখতে চাই, তাই কিছু গিট জিইউআই সঠিকভাবে লগ / ডিফার্ট প্রদর্শন করবে। যেমন, গিটগ প্রতিটি সিআর / এলএফের জন্য খালি লাইন সন্নিবেশ করবে।

উত্তর:


25

আপনি ব্যবহার করতে পারেন 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 ়ভাবে আগে একটি সম্পূর্ণ ব্যাকআপ করার পরামর্শ দিচ্ছি । আপনার লিনাক্স মেশিন থেকে এটি চালানো (আপনার উইন্ডোজের পরিবেশে যদি আপনি একটি ভাল শেল সেটআপ না করেন) সম্ভবত এটি আরও সহজ।

সম্পাদনা করুন: রূপান্তরটি প্রথমবারের দিকে ফিরে গিয়েছিল।


1
আপনাকে ধন্যবাদ, এই পোস্টটি আমাকে অনেক সাহায্য করেছে। আমি তাদের নামে ব্যবধান সহ কিছু ফাইল ছিল, মূল কমান্ড একটু পরিবর্তন এটি সংশোধন করা হয়েছে: git filter-branch --tree-filter 'git ls-files -z | xargs -0 dos2unix' -- --all। পতাকা -zএবং -0বলুন git ls-filesএবং xargsমুদ্রণ এবং nullলাইনের শেষ হিসাবে ব্যাখ্যা ।
ইভান

ডস 2 ইউনিক্স কমান্ডের আরেকটি বিকল্প হ'ল গিটের উপর নির্ভর করা:git filter-branch --prune-empty --tree-filter 'git add --renormalize .' -- --all
উইলমন্তাস বড়ানউস্কাস

6

মাদুরের উত্তরটি এই বিষয়টি সরাসরি মাথার উপরে ফেলেছে। দুর্ভাগ্যক্রমে উবুন্টু লিনাক্স-এ, সংস্করণ 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

3

এবং কোনও অতিরিক্ত সরঞ্জাম ছাড়াই (যেমন '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')"'$//' {} \;

1
কেবলমাত্র \ আর অপসারণের পরিবর্তে \ r \ n \ n এ পরিবর্তন করুন
xdevs23

আমি মনে করি যে sedsed -n -e "s/\(.*\): .*text.*/\1/p"
অনুরোধটি ছোটটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.