প্রতিশ্রুতিবদ্ধ হওয়ার আগে গিটটি স্বয়ংক্রিয়ভাবে পেছনের সাদা স্থান সরিয়ে ফেলুন


220

আমি আমার দলের সাথে গিট ব্যবহার করছি এবং আমার বিচ্ছিন্নতা, লগ, মার্জ ইত্যাদি থেকে সাদা স্থান পরিবর্তন করতে চাই I'm আমি ধরে নিচ্ছি যে এটি করার সবচেয়ে সহজ উপায় হ'ল গিটটি স্বয়ংক্রিয়ভাবে ট্রেলিং হোয়াইটস্পেস (এবং অন্যান্য হোয়াইটস্পেস ত্রুটিগুলি অপসারণ করা) হবে it ) প্রয়োগ হওয়ার সাথে সাথে সমস্ত কমিট থেকে।

আমি ~/.gitconfigফাইলটি দ্বারা নিম্নলিখিতগুলিতে যুক্ত করার চেষ্টা করেছি তবে যখন প্রতিশ্রুতিবদ্ধ তখন এটি কিছুই করে না। হতে পারে এটি অন্যরকম কিছু জন্য ডিজাইন করা হয়েছে। সমাধান কি?

[core]
    whitespace = trailing-space,space-before-tab
[apply]
    whitespace = fix

কারও কাছে রুবি নির্দিষ্ট ধারণা রয়েছে সে ক্ষেত্রে আমি রুবি ব্যবহার করছি। প্রতিশ্রুতি দেওয়ার আগে স্বয়ংক্রিয় কোড ফর্ম্যাট করা পরবর্তী পদক্ষেপ হবে তবে এটি একটি কঠিন সমস্যা এবং সত্যই কোনও বড় সমস্যা সৃষ্টি করছে না।


কোর.সাইটস স্পেসের নির্দেশিকা যদি আপনার সমস্যাগুলি সমাধান না করে তবে আপনার জন্য সেগুলি খুঁজে পেতে এবং ঠিক করার জন্য আপনি প্রাক-কমিট হুক (.git / hooks / প্রাক-প্রতিশ্রুতি) পরিবর্তন করতে পারেন। বিস্তারিত বিবরণের জন্য এই পোস্টটি দেখুন ।
ভোলকা

2
আমি অনুরূপ সাদা স্পেস ত্রুটি এবং আংশিক সমাধানগুলি নিয়ে হতাশ হয়ে পড়েছি এবং একটি নমনীয় এবং মোটামুটি বৈশিষ্ট্য-সম্পূর্ণ ইউটিলিটি লিখেছি যা সাদা সংস্করণের ত্রুটিগুলি ঠিক করতে বা কেবল রিপোর্ট করতে পারে যা বিডভিল সংস্করণ নিয়ন্ত্রণ ব্যবস্থা: গিথুবকে হোয়াইটস্পেস টোটাল ফিক্সার (ক্ষমাপ্রার্থী যদি এটি খুব স্ব-প্রচারমূলক হয়)
ড্যান লেন্সকি

উত্তর:


111

এই সেটিংগুলি ( core.whitespaceএবং apply.whitespace) সেখানে অনুসরণযোগ্য শ্বেতস্পেস সরানোর জন্য নয় তবে এতে রয়েছে:

  • core.whitespace: এগুলি সনাক্ত করুন এবং ত্রুটিগুলি বাড়ান
  • apply.whitespace: এবং তাদের ফালা, কিন্তু শুধুমাত্র প্যাচ চলাকালীন, "সর্বদা স্বয়ংক্রিয়ভাবে" নয়

আমি বিশ্বাস করি git hook pre-commitযে এটির জন্য আরও ভাল কাজ করা হবে (শ্বেত স্পেস অপসারণ সহ)


মনে রাখবেন যে কোনও নির্দিষ্ট সময়ে আপনি pre-commitহুকটি পরিচালনা না করার জন্য চয়ন করতে পারেন :

  • সাময়িকভাবে: git commit --no-verify .
  • স্থায়িভাবে: cd .git/hooks/ ; chmod -x pre-commit

সতর্কতা: ডিফল্ট, একটি দ্বারা pre-commitস্ক্রিপ্ট (যেমন এই এক ), হয়েছে না একটি বৈশিষ্ট্য "trailing অপসারণ" ", কিন্তু একটি" সতর্কবার্তা "বৈশিষ্ট্য মত:

if (/\s$/) {
    bad_line("trailing whitespace", $_);
}

আপনি তবে আরও ভাল pre-commitহুক তৈরি করতে পারেন , বিশেষত যখন আপনি এটি বিবেচনা করেন:

মঞ্চ অঞ্চলে যুক্ত হওয়া কিছু পরিবর্তন নিয়ে গিটে প্রতিশ্রুতিবদ্ধ হওয়ার ফলে এখনও একটি "পারমাণবিক" সংশোধন আসে যা কখনও কখনও কার্যকরী অনুলিপি হিসাবে উপস্থিত থাকতে পারে এবং কাজ না করে


উদাহরণস্বরূপ, ওল্ডম্যান অন্য উত্তরে একটি pre-commitহুক প্রস্তাব করেছিলেন যা শ্বেতস্পেস সনাক্ত করে এবং সরিয়ে দেয়।
যেহেতু এই হুকটি প্রতিটি ফাইলের ফাইলের নাম পায়, তাই আমি নির্দিষ্ট ধরণের ফাইলগুলির জন্য সতর্কতা অবলম্বন করার পরামর্শ দেব: আপনি .md(মার্কডাউন) ফাইলগুলিতে ট্রেলিং হোয়াইটস্পেসটি সরাতে চান না !


1
গিটটি ঘুরে দেখা যায় যে apply.whitespaceআপনার কাজের অনুলিপি পরিবর্তনকে প্যাচ হিসাবে চিকিত্সা করার জন্য গিটকে ট্রিকিংয়ের মাধ্যমে আপনার কাজের অনুলিপিটিতে শ্বেত স্থান ঠিক করার জন্য গিটকে বোঝানো যেতে পারে । দেখুন নিচের আমার উত্তর
এনটিসি 2

> "আপনি .md (মার্কডাউন) ফাইলগুলিতে চলমান সাদা স্থান সরাতে চান না" - কেন এটি? মার্কডাউন ফাইলগুলিতে হোয়াইটস্পেসটি অনুসরণ করার উদ্দেশ্য কী? আমি লক্ষ্য করেছি যে কিছু .editorconfigফাইলের একটি নির্দিষ্ট নিয়ম রয়েছে।
friederbluemle

5
@ ফ্রিডারব্লিউমেল মার্কডাউনয়ের ধরণের উপর নির্ভর করে একটি পিছনে দ্বিগুণ স্থান নির্দেশ করে <br>: github.com/FendersOfPHP/PHP-CS-Fixer/issues/…
ভোনসি

2.5.0.0 এ প্রতিশ্রুতি core.whitespaceদেওয়ার trailing-spaceসাথে সাথে সেট করা git configত্রুটি gitবাড়ায় না।
কার্ল রিখটার

43

গিটকে আপনার পরিবর্তনগুলি প্যাচ হিসাবে বিবেচনা করার জন্য ট্রিক করে আপনি গিটকে আপনার জন্য শ্বেত স্থান ঠিক করতে গিটকে চালিত করতে পারেন। "প্রাক কমিট হুক" সমাধানগুলির বিপরীতে, এই সমাধানগুলি গিটকে হোয়াইটস্পেস-ফিক্সিং কমান্ড যুক্ত করে।

হ্যাঁ, এগুলি হ্যাকস।


শক্ত সমাধান

নিম্নলিখিত গিট এলিয়াসগুলি আমার~/.gitconfig কাছ থেকে নেওয়া হয়েছে ।

"মজবুত" দ্বারা আমি বোঝাতে চাইছি গাছ বা সূচকটি নোংরা কিনা তা বিবেচনা না করেই এই এলিয়াসগুলি ত্রুটি ছাড়াই চালিত হয় doing তবে কোনও ইন্টারেক্টিভ git rebase -iইতিমধ্যে প্রগতিতে থাকলে তারা কাজ করে না ; আপনি যদি এই কোণার কেসটির বিষয়ে চিন্তা করেন তবে অতিরিক্ত চেকের জন্য আমার~/.gitconfig দেখুন , যেখানে git add -eশেষে বর্ণিত কৌশলটি কাজ করা উচিত।

আপনি যদি এগুলি সরাসরি শিটের সাথে চালাতে চান, গিট ওরফে তৈরি না করে, কেবল ডাবল উদ্ধৃতিগুলির মধ্যে সমস্ত কিছু অনুলিপি করুন এবং আটকে দিন (ধরে নিবেন যে আপনার শেলটি বাশের মতো)।

সূচক ঠিক করুন তবে গাছ নয়

নিম্নলিখিত fixwsগিট ওরফে সূচকের সমস্ত সাদা স্পেস ত্রুটিগুলি ঠিক করে তবে কোনওটি স্পর্শ করে না:

# Logic:
#
# The 'git stash save' fails if the tree is clean (instead of
# creating an empty stash :P). So, we only 'stash' and 'pop' if
# the tree is dirty.
#
# The 'git rebase --whitespace=fix HEAD~' throws away the commit
# if it's empty, and adding '--keep-empty' prevents the whitespace
# from being fixed. So, we first check that the index is dirty.
#
# Also:
# - '(! git diff-index --quiet --cached HEAD)' is true (zero) if
#   the index is dirty
# - '(! git diff-files --quiet .)' is true if the tree is dirty
#
# The 'rebase --whitespace=fix' trick is from here:
# https://stackoverflow.com/a/19156679/470844
fixws = !"\
  if (! git diff-files --quiet .) && \
     (! git diff-index --quiet --cached HEAD) ; then \
    git commit -m FIXWS_SAVE_INDEX && \
    git stash save FIXWS_SAVE_TREE && \
    git rebase --whitespace=fix HEAD~ && \
    git stash pop && \
    git reset --soft HEAD~ ; \
  elif (! git diff-index --quiet --cached HEAD) ; then \
    git commit -m FIXWS_SAVE_INDEX && \
    git rebase --whitespace=fix HEAD~ && \
    git reset --soft HEAD~ ; \
  fi"

সূচকে যদি আপনার সাদা জায়গার ত্রুটি থাকে তবে তার git fixwsআগে চালানো ধারণা git commit

সূচক এবং গাছ ঠিক করুন

নিম্নলিখিত fixws-global-tree-and-indexগিট ওরফে সূচক এবং গাছের সমস্ত সাদা স্পেস ত্রুটিগুলি ঠিক করেছে, যদি কোনও হয়:

# The different cases are:
# - dirty tree and dirty index
# - dirty tree and clean index
# - clean tree and dirty index
#
# We have to consider separate cases because the 'git rebase
# --whitespace=fix' is not compatible with empty commits (adding
# '--keep-empty' makes Git not fix the whitespace :P).
fixws-global-tree-and-index = !"\
  if (! git diff-files --quiet .) && \
     (! git diff-index --quiet --cached HEAD) ; then \
    git commit -m FIXWS_SAVE_INDEX && \
    git add -u :/ && \
    git commit -m FIXWS_SAVE_TREE && \
    git rebase --whitespace=fix HEAD~2 && \
    git reset HEAD~ && \
    git reset --soft HEAD~ ; \
  elif (! git diff-files --quiet .) ; then \
    git add -u :/ && \
    git commit -m FIXWS_SAVE_TREE && \
    git rebase --whitespace=fix HEAD~ && \
    git reset HEAD~ ; \
  elif (! git diff-index --quiet --cached HEAD) ; then \
    git commit -m FIXWS_SAVE_INDEX && \
    git rebase --whitespace=fix HEAD~ && \
    git reset --soft HEAD~ ; \
  fi"

রূপান্তরিত ফাইলগুলিতে হোয়াইটস্পেস ঠিক করতে, করুন

git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index

সহজ তবে দৃust় সমাধান নয়

এই সংস্করণগুলি অনুলিপি করা এবং আটকানো সহজ, তবে যদি তাদের পার্শ্ব শর্ত পূরণ না হয় তবে তারা সঠিক কাজটি করে না।

বর্তমান ডিরেক্টরিতে মূলযুক্ত উপ-গাছটি ঠিক করুন (তবে খালি না থাকলে সূচকটি পুনরায় সেট করুন)

git add -eপরিচয় সম্পাদক সহ প্যাচগুলি "সম্পাদনা" করতে ব্যবহার করা ::

(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset

সূচক ঠিক করুন এবং সংরক্ষণ করুন (তবে গাছটি নোংরা বা সূচক খালি থাকলে ব্যর্থ হয়)

git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~

গাছ এবং সূচি ঠিক করুন (তবে খালি না থাকলে সূচি পুনরায় সেট করুন)

git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~

এর ব্যাখ্যা export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .কৌতুক

এই উত্তরটি সম্পর্কে git rebase --whitespace=fixকৌশলটি জানার আগে আমি সর্বত্র আরও জটিল কৌশল ব্যবহার করছিলাম ।git add

যদি আমরা এটি ম্যানুয়ালি করি:

  1. সেট apply.whitespaceকরুন fix(আপনাকে কেবল এটি একবার করতে হবে):

    git config apply.whitespace fix
    

    এটি গিটকে প্যাচগুলিতে সাদা স্থান ঠিক করতে বলে ।

  2. আপনার পরিবর্তনগুলি প্যাচ হিসাবে বিবেচনা করার জন্য গিটকে রাজি করুন :

    git add -up .
    

    হিট a+ + enterপ্রতিটি ফাইলের জন্য সমস্ত পরিবর্তন নির্বাচন করতে। গিট আপনার সাদা স্থান ত্রুটিগুলি ঠিক করার বিষয়ে একটি সতর্কতা পাবেন।
    ( git -c color.ui=auto diffএই মুহুর্তে আপনার অ-সূচিযুক্ত পরিবর্তনগুলি ঠিক হোয়াইটস্পেসের ত্রুটিগুলি প্রকাশ করে)।

  3. আপনার কার্যকরী অনুলিপি থেকে হোয়াইটস্পেস ত্রুটিগুলি সরান:

    git checkout .
    
  4. আপনার পরিবর্তনগুলি ফিরিয়ে আনুন (আপনি যদি এটি সম্পাদন করতে প্রস্তুত না হন):

    git reset
    

GIT_EDITOR=:কোনো পদ্ধতি ব্যবহার করার জন্য :সম্পাদক হিসেবে, এবং একটি কমান্ড হিসাবে :পরিচয়।


1
আমি এটি কেবল উইন্ডোজে পরীক্ষা করেছি: এটি ডস কমান্ড প্রম্পটে ঠিক কাজ করে: set VISUAL= && git add -ue . && git checkout .' .' এর সাথে ব্যবহৃত দ্রষ্টব্য git add: এটি git1.8.3 এর কারণে
ভোনসি

@ ভনসি কি ভিসুয়ালকে স্থায়ীভাবে সেট করে না, যা উদাহরণস্বরূপ git commitভুল সম্পাদককে পরবর্তীকালে ব্যবহারের কারণ হতে পারে ? এটি VISUAL=এড়াতে আমি উপরের আমার ইউনিক্স সংস্করণে একটি সাব-শেলের অংশটি আবদ্ধ করি, তবে ডসের সাবস্কেল রয়েছে কিনা তা আমি জানি না।
এনটিসি 2

1
দুর্দান্ত হ্যাকের জন্য ধন্যবাদ! এফওয়াইআই, আপনি যদি core.editorসেট করে রেখে থাকেন তবে রফতানির VISUALকোনও প্রভাব নেই কারণ কনফিগারেশন সেটিংস প্রতি অগ্রাধিকার নেয় man git-var। এটিকে ওভাররাইড করতে আপনার GIT_EDITOR=:পরিবর্তে রফতানি করতে হবে।
নিক অনুভব

1
এছাড়াও, আমি fixwsইতিমধ্যে যদি আপনার ইতিমধ্যে একটি ইন্টারেক্টিভ রিবেসে পড়ে থাকি তবে দ্রুত ব্যর্থ হওয়ার সংস্করণটি আমি টুইঙ্ক করেছি যেহেতু এটি git rebase --whitespace=fixলাইনে মারা যাবে এবং আপনাকে একটি অদ্ভুত অবস্থায় ফেলে চলে যাবে। আমি এই প্রশ্ন থেকে ধার নিয়েছি এবং ঠিক আগে একটি অতিরিক্ত কেস যুক্ত করেছি: fixws = !"\ if test -d $(git rev-parse --git-dir)/rebase-merge ; then \ echo 'In rebase - cannot fixws' ; \ elif (! git diff-files --quiet .) && \ (! git diff-index --quiet --cached HEAD) ; then \ ...
নিক অনুভব করেছেন


29

আমি একটি গিট প্রাক কমিট হুক পেয়েছি যা পেছনের সাদা স্থানটিকে সরিয়ে দেয়

#!/bin/sh

if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
   against=HEAD
else
   # Initial commit: diff against an empty tree object
   against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -r 's/:[0-9]+:.*//' | uniq` ; do
   # Fix them!
   sed -i 's/[[:space:]]*$//' "$FILE"
   git add "$FILE"
done
exit

3
দ্বিতীয় অনুরোধ sed( sed -r 's/:[0-9]+:.*//') এর সাথে প্রতিস্থাপিত হতে পারে cut -f1 -d:। এটি লিনাক্স এবং বিএসডি ভিত্তিক প্ল্যাটফর্ম উভয় ক্ষেত্রে একই কাজ করা উচিত।
ইহোর কাহারলিচেনকো

2
@ ইহোরকাহারলিচেনকো: আসলে, ব্যবহার cutদ্বিতীয়টির মতো নিরাপদ নয় sed: ":" ধারণকৃত ফাইলের নামগুলির (অত্যন্ত সম্ভাবনা নেই) কাটা ব্যর্থ হবে। আপনি awk 'NF>2{NF-=2}1'নিরাপদ থাকতে ব্যবহার করতে পারেন
MestreLion

1
বিটিডাব্লু, আপনি যদি উইন্ডোজ (এমএসএসজিট) এ থাকেন এবং ব্যবহার করেন তবে আপনি সেডের পরে লুপটির অভ্যন্তরে core.autocrlf=trueযুক্ত করতে চাইতে পারেন dos2unix -D "$FILE"। অন্যথায়, এটি কেবলমাত্র এসড জারি করে সমস্ত সিআরএলএফকে এলএফগুলিতে পরিবর্তন করবে।
jakub.g

49
এরকম git addএকটি কমিট হুক ভিতরে আমাকে চমত্কার মন্দ বলে মনে হয়। আপনি যদি কোনও ফাইলের আংশিক মঞ্চায়ন / প্রতিশ্রুতিবদ্ধতা করছেন? আপনি চান না যে পুরো ফাইলটি আপনার পিছনে পিছনে প্রতিশ্রুতিবদ্ধ হোক, তাই না?
স্টেফান

19

ম্যাক ওএসে (বা, সম্ভবত কোনও বিএসডি), সেড কমান্ডের প্যারামিটারগুলি কিছুটা আলাদা হতে হবে। এটা চেষ্টা কর:

#!/bin/sh

if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
   against=HEAD
else
   # Initial commit: diff against an empty tree object
   against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -E 's/:[0-9]+:.*//' | uniq` ; do
    # Fix them!
    sed -i '' -E 's/[[:space:]]*$//' "$FILE"
    git add "$FILE"
done

এই ফাইলটি সংরক্ষণ করুন .git/hooks/pre-commit- বা ইতিমধ্যে সেখানে থাকা ফাইলটির জন্য সন্ধান করুন এবং নীচের অংশটিকে এর ভিতরে কোথাও আটকান। এবং chmod a+xএটি মনে রাখবেন ।

বা বিশ্বব্যাপী ব্যবহারের জন্য ( গিট কমিট হুকের মাধ্যমে - গ্লোবাল সেটিংস ) আপনি এটি এ দিতে পারেন $GIT_PREFIX/git-core/templates/hooks(যেখানে জিআইএসপিআরএফআইএক্স / ইউএসআর বা / ইউএসআর / স্থানীয় বা / ইউএসআর / ভাগ বা / অপ্ট / স্থানীয় / ভাগ) এবং git initআপনার বিদ্যমান রেপোর ভিতরে চালাতে পারেন ।

মতে git help init:

একটি বিদ্যমান সংগ্রহস্থলে গিট ইনিম চালানো নিরাপদ। এটি ইতিমধ্যে থাকা জিনিসগুলিকে ওভাররাইট করবে না। গিট টিআইআর পুনরায় চালনার প্রাথমিক কারণ হ'ল নতুন যুক্ত হওয়া টেম্পলেটগুলি নেওয়া।


7
এই হুকটি কি ওয়ার্কিং ফাইলটি পরিবর্তন করছে এবং পরিবর্তিত ওয়ার্কিং ফাইলের সাথে সূচিটি ওভাররাইট করছে না? আপনি যদি আপনার সূচকটি তৈরি করতে 'গিট অ্যাড-পি' করতে চান, তবে এই প্রতিশ্রুতি হুকটি উড়ে যাবে।
ম্যাথু ডটন

2
হ্যাঁ, আপনি সম্ভবত সঠিক। কারও কারও কাছে এই স্ক্রিপ্টটি পুনরায় লিখতে হতে পারে git hash-object -wএবং git update-indexমুন্ডিত ফাইলটি সরাসরি সূচীতে sertোকাতে হয়। খুব সাহসী কেউ।
অ্যালেক্সচাফি

11

আমি বরং এই কাজটি আপনার পছন্দসই সম্পাদককে ছেড়ে দেব।

সংরক্ষণের সময় ফাঁকা স্থানগুলি সরাতে একটি কমান্ড সেট করুন।


2
তেজ আপনার সাথে এটা করতে পারেন: autocmd BufWritePre .cpp, গ, * জ:% / \ গুলি \ + + $ // ই।
রবার্ট Massaioli

3
দুঃখিত, আমি এটি পরীক্ষা করার আগে উপরের মন্তব্য upvated। শতকরা চিহ্নের পরে একটি "অনুপস্থিত" রয়েছে এবং সাদা স্থান পাওয়া গেলে এটি কার্সারটিকে প্রায় ঘুরিয়ে দেবে এবং এটি সর্বশেষ অনুসন্ধানের প্যাটার্নটি সরিয়ে ফেলবে। আরও ভাল বিকল্পের জন্য vim.wikia.com/wiki/Remove_unwanted_spaces দেখুন ।
শেঠ জনসন

1
ইম্যাক্সে এটি এমএক্স-মোছা-ট্রেলিং-হোয়াইটস্পেস।
মাওভিস লেডফোর্ড

2
ইমাকের জন্য আরও ভাল, (add-hook 'before-save-hook 'delete-trailing-whitespace)আপনার .emacsফাইলে যুক্ত করে সংরক্ষণের আগে ট্রেলিং হোয়াইটস্পেস মুছতে একটি হুক সেট করুন। ইমাক্স হোয়াইটস্পেস ট্রিকস
ডানকান পার্ক

1
আমি (অ্যাড-হুক 'ফ্রি-সেভ হুক' হোয়াইটস্পেস-ক্লিনআপ) ব্যবহার করি যা ট্যাবগুলিকে স্পেসে রূপান্তর করে।
নিলস ফাগেরবুর্গ

10

গিট বৈশিষ্ট্য এবং গিট কনফিগারেশনের মাধ্যমে ফিল্টার সেটআপ ব্যবহার করে

ঠিক আছে, এই সমস্যাটি সমাধান করার ক্ষেত্রে এটি একটি নতুন কৌশল ... আমার পদ্ধতির কোনও হুক ব্যবহার না করা, বরং ফিল্টার এবং গিট বৈশিষ্ট্যগুলি ব্যবহার করা। এটি আপনাকে যা করতে দেয় সেটি হ'ল সেট আপ, আপনার বিকাশ করা প্রতিটি মেশিনে, ফিল্টারগুলির একটি সেট যা ফাইলগুলি প্রতিশ্রুতি দেওয়ার আগে অতিরিক্ত ট্রেলিং সাদা স্থান এবং অতিরিক্ত ফাঁকা রেখাগুলি আঁকবে। তারপরে একটি .gitattributes ফাইল সেটআপ করুন যা জানায় যে কোন ধরণের ফাইলগুলিতে ফিল্টার প্রয়োগ করা উচিত। ফিল্টারগুলির দুটি পর্যায় রয়েছে, cleanযা সূচকগুলিতে ফাইল যুক্ত করার সময় smudgeপ্রয়োগ করা হয় এবং যা কার্যকারী ডিরেক্টরিতে যুক্ত করার সময় প্রয়োগ করা হয়।

আপনার গিটকে একটি বিশ্বব্যাপী বৈশিষ্ট্য ফাইল অনুসন্ধান করার জন্য বলুন

প্রথমে আপনার বিশ্বব্যাপী কনফিগারেশনকে বিশ্বব্যাপী বৈশিষ্ট্য ফাইলটি ব্যবহার করতে বলুন:

git config --global core.attributesfile ~/.gitattributes_global

গ্লোবাল ফিল্টার তৈরি করুন

এখন, ফিল্টারটি তৈরি করুন:

git config --global filter.fix-eol-eof.clean fixup-eol-eof %f
git config --global filter.fix-eol-eof.smudge cat
git config --global filter.fix-eol-eof.required true

সেড স্ক্রিপ্টিং যাদু যুক্ত করুন

অবশেষে, fixup-eol-eofস্ক্রিপ্টটি আপনার পথে কোথাও রেখে দিন এবং তা সম্পাদনযোগ্য করে তোলেন। স্ক্রিপ্টটি ফ্লাই এডিটিংয়ে কিছু করার জন্য (লাইনের শেষে ফাঁকা এবং ফাঁকাগুলি এবং ফাইলের শেষে বহিরাগত ফাঁকা লাইনগুলি সরিয়ে ফেলুন) ব্যবহার করে

ফিক্সআপ-ইওল-ইওফটি দেখতে দেখতে এটির মতো হওয়া উচিত:

#!/bin/bash
sed -e 's/[  ]*$//' -e :a -e '/^\n*$/{$d;N;ba' -e '}' $1

আমার এই सार

আপনার নতুন নির্মিত ফিল্টারটিতে কোন ফাইলের প্রকারটি প্রয়োগ করতে হবে তা গিটকে বলুন

শেষ অবধি, আপনার পছন্দসই সম্পাদকটিতে ~ / .gitattributes_global তৈরি বা খুলুন এবং লাইন যুক্ত করুন:

pattern attr1 [attr2 [attr3 […]]]

সুতরাং আমরা যদি হোয়াইটস্পেসের সমস্যাটি ঠিক করতে চাই তবে আমাদের সমস্ত সি উত্স ফাইলের জন্য আমরা এমন একটি লাইন যুক্ত করব যা দেখতে এই জাতীয় দেখাচ্ছে:

*.c filter=fix-eol-eof

ফিল্টার আলোচনা

ফিল্টারটির দুটি ধাপ রয়েছে, পরিষ্কার ফেজ যা প্রয়োগ করা হয় যখন জিনিসগুলি সূচকগুলিতে যুক্ত করা হয় বা চেক ইন করা হয় এবং গিট যখন আপনার কার্যকরী ডিরেক্টরিতে স্টাফ রাখে তখন ধোঁয়াশা পর্যায়। এখানে, আমাদের ধাক্কাটি কেবলমাত্র catকমান্ডের মাধ্যমে সামগ্রীগুলি চালাচ্ছে যা ফাইলের শেষে না থাকলে সম্ভবত একটি ট্রিলিং নিউলাইন চরিত্র যুক্ত করার ব্যতীত এগুলি অপরিবর্তিত রাখা উচিত। ক্লিন কমান্ড হ'ল হোয়াইটস্পেস ফিল্টারিং যা আমি http://sed.sourceforge.net/sed1line.txt নোট থেকে একসাথে আঁকড়েছি । দেখে মনে হচ্ছে এটি অবশ্যই একটি শেল স্ক্রিপ্টে রাখা উচিত, আমি ফাইলের শেষে গিট-কনফিগারেশনের ফাইলের শেষে এক্সট্রান্সিয়াস অতিরিক্ত লাইনগুলির স্যানিটেশন সহ সেড কমান্ডটি কীভাবে ইনজেক্ট করব তা আমি বুঝতে পারি নি। (আপনি পারেনঐ খালি trailing, তবে, একটি পৃথক কিন্তু স্ক্রিপ্টের প্রয়োজন ছাড়াই পরিত্রাণ পেতে, শুধু সেট filter.fix-eol-eofভালো কিছু করার জন্য sed 's/[ \t]*$//' %fযেখানে \tট্যাব টিপে, একটি প্রকৃত ট্যাব।)

প্রয়োজন = সত্য আপনাকে সমস্যা থেকে দূরে রাখার জন্য কিছু ভুল হয়ে থাকলে ত্রুটি উত্থাপন করে।

গিটার সম্পর্কিত আমার ভাষা যদি সঠিক না হয় তবে দয়া করে আমাকে ক্ষমা করুন। আমি মনে করি আমার ধারণাগুলি সম্পর্কে মোটামুটি ভাল উপলব্ধি আছে তবে এখনও আমি পরিভাষাটি শিখছি।


আকর্ষণীয় পদ্ধতির। +1
ভনসি

ধন্যবাদ @ ভনসি! আমি এই সুযোগটিও তুলে ধরে বলতে চাই যে গিট বৈশিষ্ট্যগুলি .gitবিশ্বব্যাপী পরিবর্তে ফোল্ডারে প্রতি-রেজিস্ট্রি ভিত্তিতে কনফিগার করা যেতে পারে , যা সম্ভবত আরও বোধগম্য হতে পারে।
zbeekman

9

আমি এই প্রাক-কমিট হুকটি লিখেছি, যা কেবলমাত্র আপনি পরিবর্তন করেছেন / যুক্ত করেছেন এমন রেখাগুলি থেকে চলমান শ্বেত-স্থানকে সরিয়ে দেয়, কারণ পূর্ববর্তী পরামর্শগুলি লক্ষ্যযোগ্য ফাইলগুলিতে খুব বেশি শ্বেত-স্থান অনুসরণ করে থাকলে অপঠনীয় কমিট তৈরি করে।

#!/bin/sh

if git rev-parse --verify HEAD >/dev/null 2>&1 ; then
   against=HEAD
else
   # Initial commit: diff against an empty tree object
   against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

IFS='
'

files=$(git diff-index --check --cached $against -- | sed '/^[+-]/d' | perl -pe 's/:[0-9]+:.*//' | uniq)
for file in $files ; do
    diff=$(git diff --cached $file)
    if test "$(git config diff.noprefix)" = "true"; then
        prefix=0
    else
        prefix=1
    fi
    echo "$diff" | patch -R -p$prefix
    diff=$(echo "$diff" | perl -pe 's/[ \t]+$// if m{^\+}')
    out=$(echo "$diff" | patch -p$prefix -f -s -t -o -)
    if [ $? -eq 0 ]; then
        echo "$diff" | patch -p$prefix -f -t -s
    fi
    git add $file
done

1
মজাদার. +1 টি। খালি গাছটি গণনার জন্য আমার অন্য উত্তরটি দেখুন ।
ভনসি

1
ভাল ধারণা, আমি ঠিক এইটাই চাই তবে এটি ব্যবহার করার সময় সাবধান! আমার জন্য ওএসএক্স এবং গিট ভার্সন ২.৩.৫ এ এটি আমার মঞ্চে যে কোনও অ্যাড কিন্তু অনির্ধারিত পরিবর্তনগুলি উড়িয়ে দিয়েছে। আমি এখনও এই জন্য একটি কাজের সমাধান আগ্রহী হবে।
ক্যাস্পার

9

দয়া করে আমার প্রাক-প্রতিশ্রুতি হুকগুলি ব্যবহার করে দেখুন , এটি ট্রেলিং-হোয়াইটস্পেসটি স্বয়ংক্রিয়ভাবে সনাক্ত করতে এবং এটিকে সরাতে পারে । ধন্যবাদ!

এটি অধীনে কাজ করতে পারেন GitBash(windows), Mac OS X and Linux!


স্ন্যাপশট:

$ git commit -am "test"
auto remove trailing whitespace in foobar/main.m!
auto remove trailing whitespace in foobar/AppDelegate.m!
[master 80c11fe] test
1 file changed, 2 insertions(+), 2 deletions(-)


@ ভনসি আপনার সত্যিকারের জন্য ধন্যবাদ! '.Md' এর কাছে, আমি কেবল খুঁজে পেয়েছি git commit -no-verify, কোনও অভিজাত?
ওল্ডম্যান

.mdশেষের ব্যবহারকারীকে --no-verifyএই বিকল্পটিতে বিকল্প যুক্ত করতে বলার চেয়ে আমি হুককে ফাইল সনাক্ত করতে সক্ষম করব এবং শ্বেত স্পেসগুলি সরিয়ে ফেলতে সক্ষম করব না git commit
ভোনসি

কোনও ফাইল / ডিরেক্টরি সংঘটিত হতে ব্যর্থ হয় যা কোনও +বা-
রডি ওলেনহুইস

6

এখানে একটি উবুন্টু + ম্যাক ওএস এক্স সামঞ্জস্যপূর্ণ সংস্করণ:

#!/bin/sh
#

# A git hook script to find and fix trailing whitespace
# in your commits. Bypass it with the --no-verify option
# to git-commit
#

if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
  against=HEAD
else
  # Initial commit: diff against an empty tree object
  against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | (sed -r 's/:[0-9]+:.*//' > /dev/null 2>&1 || sed -E 's/:[0-9]+:.*//') | uniq` ; do
  # Fix them!
  (sed -i 's/[[:space:]]*$//' "$FILE" > /dev/null 2>&1 || sed -i '' -E 's/[[:space:]]*$//' "$FILE")
  git add "$FILE"
done

# Now we can commit
exit

আনন্দ কর


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

কোনও পার্থক্য হ'ল সংস্করণটি প্রথমে উবুন্টু সিনট্যাক্স ব্যবহার করছে এবং (যদি এটি ব্যর্থ হয়) তবে পরে ওএসএক্সটি ব্যবহার করা হবে।
এডপোল্ড

1
আমি এসডিপোল্ডের পোস্ট সম্পাদনা করেছি, এটি এখন ফাইলের নামগুলিতে হোয়াইটস্পেসের অনুমতি দিতে সক্ষম হওয়া উচিত।
imme

5

আজ এই সম্পর্কে চিন্তা ছিল। জাভা প্রকল্পের জন্য আমি এই কাজটিই শেষ করেছি:

egrep -rl ' $' --include *.java *  | xargs sed -i 's/\s\+$//g'

3

জন্য সর্বোচ্চ টেক্সট ব্যবহারকারীদের।

আপনার সেটিং-ব্যবহারকারীর কনফিগারেশনে যথাযথভাবে নিম্নলিখিতটি সেট করুন ।

"trim_trailing_white_space_on_save": true


1
ফাইল টাইপ দ্বারা এটি সেট করার উপায় কি? আমার কাছে *.md(মার্কডাউন) ফাইল রয়েছে যা সাধারণ চিহ্নিত করার জন্য "" (ডাবল-স্পেসের পিছনে) উপর নির্ভর করে <br />এবং সেটিংটি আমার অনুসরণযোগ্য স্থানগুলি সরাতে চাই না এমন ফাইলগুলি সহ সমস্ত ফাইলে প্রযোজ্য বলে মনে হয় ।
ভনসি

@VonC অনুক্রমের এখানে কিভাবে কনফিগারেশন প্রয়োগ করা হয় আরো বিস্তারিত জানার উপর নেই, stackoverflow.com/questions/16983328/... আশা করি এটা সাহায্য করে
হারিস Krajina

2

ফাইলগুলির জন্য লুপটি $ আইএফএস শেল পরিবর্তনশীল ব্যবহার করে। প্রদত্ত স্ক্রিপ্টে, তাদের মধ্যে একটি চরিত্রের ফাইলের নাম যা $ আইএফএস-ভেরিয়েবলের মধ্যে রয়েছে সেগুলি ফোর-লুপে দুটি পৃথক ফাইল হিসাবে দেখা যাবে। এই স্ক্রিপ্টটি এটিকে ঠিক করে দিয়েছে: প্রদত্ত সেড-ম্যানুয়াল হিসাবে মাল্টলাইন-মোড মডিফায়ারটি আমার উবুন্টু বাক্সে ডিফল্টরূপে কাজ করবে বলে মনে হচ্ছে না, তাই আমি আলাদা বাস্তবায়ন চেয়েছি এবং এটি একটি পুনরাবৃত্ত লেবেল সহ পেয়েছি, মূলত এটি কেবলমাত্র প্রতিস্থাপন শুরু করবে ফাইলটির শেষ লাইনটি যদি আমি এটি সঠিকভাবে বুঝতে পারি।

#!/bin/sh
#

# A git hook script to find and fix trailing whitespace
# in your commits. Bypass it with the --no-verify option
# to git-commit
#

if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

SAVEIFS="$IFS"
# only use new-line character as seperator, introduces EOL-bug?
IFS='
'
# Find files with trailing whitespace
for FILE in $(
    git diff-index --check --cached $against -- \
    | sed '/^[+-]/d' \
    | ( sed -r 's/:[0-9]+:.*//' || sed -E 's/:[0-9]+:.*//' ) \
    | uniq \
)
do
# replace whitespace-characters with nothing
# if first execution of sed-command fails, try second one( MacOSx-version)
    (
        sed -i ':a;N;$!ba;s/\n\+$//' "$FILE" > /dev/null 2>&1 \
        || \
        sed -i '' -E ':a;N;$!ba;s/\n\+$//' "$FILE" \
    ) \
    && \
# (re-)add files that have been altered to git commit-tree
#   when change was a [:space:]-character @EOL|EOF git-history becomes weird...
    git add "$FILE"
done
# restore $IFS
IFS="$SAVEIFS"

# exit script with the exit-code of git's check for whitespace-characters
exec git diff-index --check --cached $against --

[1] সেড-সাবসিশন প্যাটার্ন: আমি কীভাবে একটি নতুন লাইন (\ n) সিড ব্যবহার করে প্রতিস্থাপন করতে পারি?


2

এটি প্রতিশ্রুতিবদ্ধ হওয়ার পূর্বে স্বয়ংক্রিয়ভাবে সাদা স্থান সরিয়ে দেয় না , তবে এটি কার্যকরভাবে কার্যকর। আমি নিম্নলিখিত পার্ল স্ক্রিপ্টটি it PATH এর একটি dir এ গিট-ডাব্লুএসএফ (গিট হোয়াইটস্পেস ফিক্স) নামের একটি ফাইলে রেখেছি যাতে আমি পারি:

গিট ডাব্লুএসএফ | SH

এবং এটি কেবলমাত্র ফাইলগুলির লাইন থেকে সমস্ত সাদা স্থানকে সরিয়ে দেয় যা গিটার প্রতিবেদনকে আলাদা করে বলে।

#! /bin/sh
git diff --check | perl -x $0
exit

#! /usr/bin/perl

use strict;

my %stuff;
while (<>) {
    if (/trailing whitespace./) {
        my ($file,$line) = split(/:/);
        push @{$stuff{$file}},$line;
    }
}

while (my ($file, $line) = each %stuff) {
    printf "ex %s <<EOT\n", $file;
    for (@$line) {
        printf '%ds/ *$//'."\n", $_;
    }
    print "wq\nEOT\n";
}

0

কিছুটা দেরি হলেও যেহেতু এটি কারওর বাইরে আসতে সাহায্য করতে পারে তাই চলে।

ভিআইএম-এ ফাইলটি খুলুন। হোয়াইটস্পেসের সাথে ট্যাবগুলি প্রতিস্থাপন করতে, vim কমান্ড লাইনে নিম্নলিখিত টাইপ করুন

:%s#\t#    #gc

অন্যান্য ট্রেলিং হোয়াইটস্পেসগুলি থেকে মুক্তি পেতে

:%s#\s##gc

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


যদি এটি ক্লান্তিকর হয়ে পড়ে - এবং আপনি যা সম্পাদনা করতে চলেছেন তার যদি আপনার ব্যাকআপ থাকে - তবে আমি প্রায়শই কেবল ফাঁকাগুলিতে ট্যাবগুলি পরিবর্তন করতে সেড ব্যবহার করি: sed -i 's|\t| |g' filenames(প্রতিস্থাপনের অবস্থানে ফাঁকা স্থান)। মনে রাখবেন যে আপনি নিজের ফাইলের নাম পেতে সন্ধান করতে পারেন। আপনি যদি সেই ব্যাকআপটি কীভাবে পাবেন তা চিন্তা না করে থাকেন, তবে আমি সাধারণত সমস্ত কিছু সম্পাদন করি এবং তারপরে নরম রিসেটের সাথে প্রতিশ্রুতিটি 'পূর্বাবস্থায়' ফিরিয়ে আছি যেখানে আমি আছি; কখনও কখনও আমি গাছের সাথে সমস্ত কিছু যুক্ত করি তবে প্রতিশ্রুতি দেয় না এবং কখনও কখনও আমি স্ট্যাশ / প্রয়োগ করি (পপ না!)। যদি আমি উদ্বিগ্ন বোধ, আমি আমার সমগ্র গাছ একটি নিরাপদ অবস্থানে অনধিকারচর্চা আগে rsync ...
ঋষি

0

কোনও ফাইলের পোর্টেবলীতে লাইনের শেষে ট্রেলিং হোয়াইটস্পেস মুছতে, ব্যবহার করুন ed:

test -s file &&
   printf '%s\n' H ',g/[[:space:]]*$/s///' 'wq' | ed -s file

-1

এটি সম্ভবত আপনার সমস্যার সমাধান করবে না, তবে আপনি সম্ভবত আপনার প্রকৃত প্রকল্প স্পেসে গিট-কনফিগারারের মাধ্যমে সেট করতে চান, যা ./.git/config সম্পাদনা করে ~ / .gitconfig এর বিপরীতে। সমস্ত প্রকল্পের সদস্যদের মধ্যে সেটিংস সামঞ্জস্য রেখে ভাল লাগছে।

git config core.whitespace "trailing-space,space-before-tab"
git config apply.whitespace "trailing-space,space-before-tab"

3
আমি যতদূর জানি, .git ভিতরে সেটিংস না অন্য কারো সঙ্গে ভাগ; এগুলি আপনার স্থানীয় রেপোর জন্য নির্দিষ্ট
অ্যালেক্সচফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.