গিট ফিল্টার-শাখার সাথে লাইন-এন্ডিংগুলি ঠিক করার চেষ্টা করা হচ্ছে, তবে ভাগ্য নেই


270

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

আমি ভেবেছিলাম আমি এখানে একটি উত্তর পেয়েছি তবে এটি আমার জন্য কাজ করতে পারি না। আমার লিনাক্স কমান্ড লাইন জ্ঞানটি সর্বাধিক সীমাবদ্ধ, তাই "স্ক্রিনে" xargs fromdos "লাইন কী করে তাও আমি নিশ্চিত নই। আমি এ জাতীয় কোনও ফাইল বা ডিরেক্টরি বিদ্যমান নেই সম্পর্কে বার্তা পেতে থাকি এবং যখন আমি এটি কোনও বিদ্যমান ডিরেক্টরিতে নির্দেশ করতে পরিচালিত করি তখন এটি আমাকে বলে যে আমার অনুমতি নেই।

আমি উইন্ডোজ এবং ম্যাক ওএস এক্স টার্মিনালের মাধ্যমে এমএসএসজিট দিয়ে চেষ্টা করেছি।


আমি প্রায় যথেষ্ট যথেষ্ট এই থ্রেড upvote করতে পারবেন না। এটি সম্পর্কে সর্বোত্তম উত্তর প্রদানের জন্য এটি +1 ++।
sjas

চার্লসের সাথে একমত তবে, আমার ক্ষেত্রে (ম্যাক ওএস এক্স 10.8 ব্যবহার করে)> গিট কনফিগারেশন কোর.আউটোক্রল্ফ মিথ্যা কাজ করেছে, না> গিট কনফিগারেশন কোর.আউটোক্রল্ফ ইনপুট
ইউজার 1045085

উত্তর:


187

গিটট্রিবিউটসের জন্য গিট ডকুমেন্টেশন এখন আপনার প্রকল্পের সমস্ত লাইন শেষ "ফিক্সিং" বা স্বাভাবিক করার জন্য অন্য পদ্ধতির নথি করে। এখানে এর সংক্ষিপ্তসার:

$ echo "* text=auto" >.gitattributes
$ git add --renormalize .
$ git status        # Show files that will be normalized
$ git commit -m "Introduce end-of-line normalization"

যদি কোনও ফাইল যা স্বাভাবিক করা উচিত না গিটের স্থিতিতে প্রদর্শিত হয়, গিট অ্যাড-ইউ চালানোর আগে তাদের পাঠ্য বৈশিষ্ট্যটি আনসেট করুন।

manual.pdf -text

বিপরীতে, গিট সনাক্ত না করে এমন টেক্সট ফাইলগুলিতে ম্যানুয়ালি স্বাভাবিককরণ সক্ষম করা যেতে পারে।

weirdchars.txt text

এটি --renormalize2018 সালের জানুয়ারিতে প্রকাশিত গিট v2.16.0-এ যুক্ত হওয়া একটি নতুন পতাকা ব্যবহার করে g গীটের পুরানো সংস্করণগুলির জন্য আরও কয়েকটি পদক্ষেপ রয়েছে:

$ echo "* text=auto" >>.gitattributes
$ rm .git/index     # Remove the index to force git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

1
git resetদয়া করে আমাকে বলতে পারেন যে এর উদ্দেশ্য কী ?
সিআরডিএক্স

1
সূচকটি পুনর্নির্মাণের জন্য গিটকে জোর করে, সেই সময়ে এটি প্রতিটি ফাইলের বাইনারি কিনা তা অনুমান করার জন্য স্ক্যান করে। আরএম পুরানো সূচি মুছে দেয়, পুনরায় সেট করে নতুন সূচক তৈরি করে।
রাশ ইগান

16
ধন্যবাদ, এটি আমার পক্ষে কাজ করেছে। দৌড়ানোর পরে একটি দরকারী কমান্ড git statusহ'ল চালানো git diff --ignore-space-at-eolএই বিষয়টি নিশ্চিত হওয়া যে আপনি যে পরিবর্তনগুলি করছেন তা লাইন শেষ।
জেলানিক্স

1
দ্রষ্টব্য: এই এবং "পুরানো" সমাধানের মধ্যে কেবলমাত্র "আসল" পার্থক্যটি .gitattributes (উপযুক্ত সামগ্রী সহ) এর উপস্থিতিতে। এটি ছাড়া, git resetকোনও পরিবর্তন সনাক্ত করতে পারবেন না এবং এটি অকেজো।
রব

3
নির্দেশাবলী gitattributes পৃষ্ঠা সুবিধা গ্রহণ করতে আপডেট করা হয়েছে --renormalizeপতাকা Git v2.16.0 যোগ যা জানুয়ারী 2018 মুক্তি পায় --renormalizeপতাকা একটি কমান্ডের প্রতিটি ট্র্যাক করা ফাইলের জন্য পুনরায় প্রক্রিয়াকরণের লাইন শেষা w শ প্রক্রিয়া consolidates: git add --renormalize .
মাইক হিল

389

এটির সমাধানের সবচেয়ে সহজ উপায় হ'ল একটি প্রতিশ্রুতিবদ্ধ করা যা সমস্ত লাইন শেষকে স্থির করে। ধরে নিচ্ছি যে আপনার কাছে কোনও সংশোধিত ফাইল নেই, তবে আপনি নিম্নলিখিত হিসাবে এটি করতে পারেন।

# From the root of your repository remove everything from the index
git rm --cached -r .

# Change the autocrlf setting of the repository (you may want 
#  to use true on windows):
git config core.autocrlf input

# Re-add all the deleted files to the index
# (You should get lots of messages like:
#   warning: CRLF will be replaced by LF in <file>.)
git diff --cached --name-only -z | xargs -0 git add

# Commit
git commit -m "Fixed crlf issue"

# If you're doing this on a Unix/Mac OSX clone then optionally remove
# the working tree and re-check everything out with the correct line endings.
git ls-files -z | xargs -0 rm
git checkout .

7
PS আমি github.com এ ছেলেদের কাছে আপনার ফিক্সটি সুপারিশ করেছি এবং তারা আপনার সমাধানটি ব্যবহার করতে তাদের সহায়তা নির্দেশিকা আপডেট করেছে (পূর্বে এটি একটি নতুন ক্লোন এবং একটি হার্ড রিসেটের সুপারিশ করেছিল যা সমস্ত ফাইল পাবে বলে মনে হয় না help
ব্রায়ান ডোনাহু

31
ধন্যবাদ ... এটি দুর্দান্ত সমাধান। এটি গিটহাবে পাওয়া গেছে।
PHLAK

4
আপনি নন-টেক্সট ফাইলে (যেমন বাইনারি হিসাবে) crlfs পরিবর্তন করছেন না তা নিশ্চিত করতে আপনি config.safecrlf পরীক্ষা করে দেখতে চাইতে পারেন। এটি দস্তাবেজগুলি kernel.org/pub/software/scm/git/docs/git-config.html এ দেখুন
vrish88

4
@ ভিরিশ ৮৮: আপনি যদি এই পরিস্থিতিতে থাকেন তবে, আপনি সম্ভবত মিশ্র রেখাযুক্ত প্রান্ত এবং কোরের সমস্যায় ভুগছেন।স্যাফেক্রল্ফ আসলে আপনাকে যা করতে হবে তা করতে বাধা দিতে পারে। স্যাফক্রফ ব্যবহার না করা সম্ভবত সহজ। গিটটি প্রায়শই বাইনারি ফাইল সনাক্তকরণ ভুল করে না এবং যদি এটি করে তবে আপনি নিজেই এটিকে .gitattribute দিয়ে বাইনারি হিসাবে চিহ্নিত করতে পারেন এবং পূর্ববর্তী প্রতিশ্রুতি থেকে সঠিক সংস্করণটি পুনরুদ্ধার করতে পারেন।
সিবি বেইলি

26
নীচে রাশ ইগানের উত্তরে প্রস্তাবিত নতুন সমাধানটি সহজ এবং আপনার সমস্ত উত্স কোড মুছে ফেলার মতো ভীতিজনক বিষয়গুলির সাথে জড়িত নয় , তাই আমি সত্যিই লোকদের এটি ব্যবহারের পরামর্শ দেব, যদিও এই পুরানো সমাধানটি 10 ​​গুণ বেশি ভোট পেয়েও!
পোরকুলাস

11

লাইন শেষের সাথে ডিল করার জন্য আমার পদ্ধতিটি নীচে রয়েছে (অনেকগুলি রেপোর উপরে যুদ্ধ পরীক্ষা করা হয়েছে):

একটি নতুন রেপো তৈরি করার সময়:

  • করা .gitattributesখুব প্রথম হিসাবে অন্যান্য টিপিক্যাল ফাইলগুলি অন্তর্ভুক্ত থাকে কমিট .gitignoreএবংREADME.md

বিদ্যমান রেপোগুলির সাথে কাজ করার সময়:

  • .gitattributesসেই অনুযায়ী তৈরি করুন / পরিবর্তন করুন
  • git commit -a -m "Modified gitattributes"
  • git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
    • -n( --no-verifyপ্রাক-প্রতিশ্রুতি হুক এড়িয়ে যাওয়া হয়)
    • আমাকে প্রায়শই পর্যাপ্ত পরিমাণে করতে হয় যে আমি এটির নাম হিসাবে সংজ্ঞা দিয়েছি alias fixCRLF="..."
  • পূর্ববর্তী কমান্ডটি পুনরাবৃত্তি করুন
    • হ্যাঁ, এটি ভুডু, তবে সাধারণত আমাকে কমান্ডটি দু'বার চালাতে হবে, প্রথমবার এটি কিছু ফাইল স্বাভাবিক করে তোলে, দ্বিতীয়বারের চেয়েও বেশি ফাইল। কোনও নতুন প্রতিশ্রুতি তৈরি না হওয়া পর্যন্ত সাধারণত এটি পুনরাবৃত্তি করা সবচেয়ে ভাল :)
  • পুরানো (সাধারণীকরণের ঠিক আগে) এবং নতুন শাখার মধ্যে কয়েকবার পিছনে পিছনে যান। ব্রাঞ্চটি স্যুইচ করার পরে, কখনও কখনও গিট আরও বেশি ফাইল খুঁজে পায় যা পুনর্নবীকরণ করা দরকার!

ইন .gitattributesআমি সব পাঠ্য ফাইল স্পষ্টভাবে ঘোষণা এলএফ EOL তার হিসাবে যেহেতু সাধারণত উইন্ডোজ সাধনী দ্বারা প্রয়োগকরণ যখন অ উইন্ডোজ সাধনী দ্বারা প্রয়োগকরণ CRLF সাথে সামঞ্জস্যপূর্ণ নয় এলএফ সঙ্গে সামঞ্জস্যপূর্ণ (এমনকি অনেক nodejs আদেশ এলএফ লাইন টুলস অনুমান তাই আপনার ফাইল মধ্যে EOL পরিবর্তন করতে পারেন)।

বিষয়বস্তু .gitattributes

আমার .gitattributesসাধারণত দেখতে:

*.html eol=lf
*.js   eol=lf
*.json eol=lf
*.less eol=lf
*.md   eol=lf
*.svg  eol=lf
*.xml  eol=lf

বর্তমান রেপোতে গিট দ্বারা কোন স্বতন্ত্র এক্সটেনশনগুলি ট্র্যাক করা হয়েছে তা নির্ধারণ করতে, এখানে দেখুন

সাধারণীকরণের পরে সমস্যাগুলি

একবার এটি হয়ে গেলে, তবে আরও একটি সাধারণ সতর্কতা রয়েছে।

আপনার masterইতিমধ্যে আপ-টু-ডেট এবং সাধারণীকরণ করুন এবং তারপরে আপনি চেকআউট করুন outdated-branch। বেশিরভাগ সময় সেই শাখাটি পরীক্ষা করে দেখার পরে, গিট অনেকগুলি ফাইলকে পরিবর্তিত হিসাবে চিহ্নিত করে।

সমাধানটি হ'ল জাল কমিট ( git add -A . && git commit -m 'fake commit') করা এবং তারপরে git rebase master। প্রত্যাবাসনের পরে, জাল কমিটটি চলে যাওয়া উচিত।


1
আমি ভেবেছিলাম আমি পাগল হয়ে যাচ্ছি যতক্ষণ না আমি আপনার পোস্টটি পড়েছি, কারণ আমাকে বেশ কয়েকবার কমান্ডের নির্দিষ্ট ক্রমটি চালাতে হয়েছিল। ভুডু! ;)
শন ফসেট

গিট সংস্করণ সহ 2.7.0.windows.1, আমি নিম্নলিখিতটি ব্যবহার করেছি: git rm --cached -r . && git reset --hard && git add . && git commit -m "Normalize EOL" -n
সান ফসেট

4
git status --short|grep "^ *M"|awk '{print $2}'|xargs fromdos

ব্যাখ্যা:

  • git status --short

    এটি প্রতিটি লাইন প্রদর্শন করে যা গিটটি এবং সচেতন নয়। গিট নিয়ন্ত্রণে নেই এমন ফাইলগুলি লাইনের শুরুতে একটি '?' দিয়ে চিহ্নিত করা হয়েছে। যে ফাইলগুলি সংশোধন করা হয়েছে সেগুলিকে একটি এম দিয়ে চিহ্নিত করা হয়েছে

  • grep "^ *M"

    এটি কেবলমাত্র সেই ফাইলগুলিকেই ফিল্টার করে যা সংশোধিত হয়েছে।

  • awk '{print $2}'

    এটি কোনও চিহ্ন ছাড়াই কেবল ফাইলের নাম দেখায়।

  • xargs fromdos

    এটি পূর্ববর্তী কমান্ড থেকে ফাইলের নাম গ্রহণ করে এবং লাইন-এন্ডিংগুলিকে রূপান্তর করতে 'fromdos' ইউটিলিটির মাধ্যমে চালায়।


এটা সত্যিই দারুন. ধন্যবাদ. যে কেউ এর dos2unixপরিবর্তে হোমব্রিউ ব্যবহার করে সমাধান খুঁজছেন fromdos
আলিমির সারাজিč

4

আমি কীভাবে পুরো ইতিহাসের ব্যবহার করে সমস্ত লাইনের সমাপ্তি স্থির করেছিলাম তা এখানে git filter-branch^Mচরিত্র ব্যবহার প্রবেশ করা প্রয়োজন CTRL-V+ + CTRL-M। আমি dos2unixস্বয়ংক্রিয়ভাবে বাইনারি ফাইলগুলি এড়িয়ে যাওয়ার পরে আমি ফাইলগুলিতে রূপান্তর করতাম ।

$ git filter-branch --tree-filter 'grep -IUrl "^M" | xargs -I {} dos2unix "{}"'


3

"| Xargs fromdos" স্ট্যান্ডার্ড ইনপুট থেকে (ফাইলগুলি findসন্ধান করে) পড়ে এবং কমান্ডের আর্গুমেন্ট হিসাবে এটি ব্যবহার করে fromdosযা লাইন শেষকে রূপান্তর করে। (এই পরিবেশগুলিতে কি ডিএস স্ট্যান্ডার্ড? আমি ডস 2 ইউনিক্সে অভ্যস্ত)। নোট করুন যে আপনি xargs ব্যবহার এড়াতে পারবেন (বিশেষত দরকারী যদি আপনার যথেষ্ট পরিমাণে ফাইল থাকে যে যুক্তির তালিকাটি xargs এর জন্য খুব দীর্ঘ):

find <path, tests...> -exec fromdos '{}' \;

অথবা

find <path, tests...> | while read file; do fromdos $file; done

আমি আপনার ত্রুটি বার্তাগুলি সম্পর্কে সম্পূর্ণ নিশ্চিত নই। আমি এই পদ্ধতিটি সফলভাবে পরীক্ষা করেছি। প্রতিটি প্রোগ্রাম কি উত্পাদন করছে? আপনার কাছে কোন ফাইল / ডিরেক্টরিগুলির অনুমতি নেই? তবে এটি কী হতে পারে তা অনুমান করার জন্য এখানে একটি ছুরিকা:

স্ক্রিপ্টের জন্য 'ফাইল খুঁজে পাওয়া যায়নি' ত্রুটি পাওয়ার একটি সহজ উপায় হ'ল আপেক্ষিক পথটি ব্যবহার করে - নিখুঁত কোনওটি ব্যবহার করুন। একইভাবে আপনি যদি আপনার স্ক্রিপ্টটি কার্যকরযোগ্য (chmod + x) না করে থাকেন তবে আপনি অনুমতি ত্রুটি পেতে পারেন।

মন্তব্য যুক্ত করুন এবং আমি চেষ্টা করব এবং এটি কার্যকর করতে আপনাকে সহায়তা করব!


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

1

ঠিক আছে ... সাইগউইনের অধীনে আমাদের কাছে সহজেই ডস পাওয়া যায় না, এবং যদি আপনার পরিবর্তিত ফাইলের (আমাদের কাছে) পাথের কোনও ফাঁকা জায়গা থাকে তবে আপনার মুখের মধ্যে এই অজস্র সাবটিব ফুঁসে উঠেছে, তাই আমাকে কিছুটা আলাদাভাবে করতে হয়েছিল:

git status --short | grep "^ *M" | sed 's/^ *M//' | xargs -n 1 dos2unix

এই সমাধানের সর্বাধিক সংখ্যার জন্য @ লয়েড থেকে কুদোস


-2

অন্য কোনও উত্তর যদি আপনার পক্ষে কাজ না করে তবে এই পদক্ষেপগুলি অনুসরণ করুন:

  1. আপনি যদি উইন্ডোজে থাকেন তবে করুন git config --global core.autocrlf true; আপনি যদি ইউনিক্সে থাকেন তবে করুনgit config core.autocrlf input
  2. চালান git rm --cached -r .
  3. ফাইলটি মুছুন .gitattributes
  4. চালান git add -A
  5. চালান git reset --hard

তাহলে আপনার লোকাল এখনই পরিষ্কার হওয়া উচিত।


4
সত্যি? .gitattributesফাইল মুছে ফেলা কি লাইন এন্ডিং সমস্যার সমাধান?
আলেকসান্দ্র এম

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