কেবল অ-সাদা-স্থান পরিবর্তন করুন


343

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

প্রতিবার যখন আমি কোনও প্যাচ জমা দেওয়ার চেষ্টা করব তখন কেবল প্রাসঙ্গিক তথ্য বেছে নেওয়ার জন্য আমাকে প্রথমে হাত দ্বারা সমস্ত সাদা স্থান-কেবলমাত্র পরিবর্তনগুলি উপেক্ষা করতে হবে। শুধু তা-ই নয়, আমি যখন দৌড়াই তখন git rebaseআমি সাধারণত তাদের বেশ কয়েকটি সমস্যায় পড়ি।

এর মতো আমি কেবল সূচিহীন স্থান পরিবর্তনের সূচকগুলিতে যুক্ত করতে সক্ষম হতে চাই, একইভাবে git add -pহয় তবে সমস্ত পরিবর্তন নিজেই বাছাই না করেই।

কেউ কি জানেন, এটা কিভাবে করে?

সম্পাদনা: আমি প্রকল্পটির কাজ করার পদ্ধতিটি পরিবর্তন করতে পারি না এবং তারা এটিকে অগ্রাহ্য করার জন্য মেলিং তালিকায় আলোচনার পরে সিদ্ধান্ত নিয়েছে।

উত্তর:


395

@ ফ্রিউ সমাধানটি আমার যা প্রয়োজন ঠিক তা ছিল না, তাই ঠিক একই সমস্যার জন্য আমি তৈরি করা এই উপনামটি:

alias.addnw=!sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero -'

অথবা আপনি কেবল চালাতে পারেন:

git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -

হালনাগাদ

এই মন্তব্য অনুসারে -U0, বিকল্পগুলি এবং --unidiff-zeroযথাক্রমে কাজের প্রসঙ্গের সাথে ম্যাচ করার জন্য যুক্ত হয়েছে

মূলত এটি প্যাচ প্রয়োগ করে যা addসাদা স্থান পরিবর্তন ছাড়াই প্রয়োগ করা হবে without আপনি লক্ষ্য করবেন যে এর পরেও git addnw your/fileঅনাস্থাবিহীন পরিবর্তনগুলি হবে, এটি শ্বেতস্থান বাকী রয়েছে।

- কোনও রঙের প্রয়োজন হয় না তবে আমার যেমন রঙ সর্বদা সেট করা থাকে, তেমনি আমাকে এটি ব্যবহার করতে হবে। যাইহোক, দুঃখিত চেয়ে ভাল নিরাপদ।


7
এটি আমার পক্ষে ভাল কাজ করেছে, তবে আমাকে ব্যবহার করতে হবে git apply --ignore-whitespaceঅন্যথায় প্যাচটি সুস্পষ্ট কারণে প্রযোজ্য হবে না।
jupp0r

106
সত্যিই গিট অ্যাডের জন্য একটি বিকল্প থাকা উচিত, এটি এর মতো git add -wকরে।
জার্ল

7
এটি আমার সঙ্গে সমস্যা দেয় patch does not applyএবং error while searching for... কোন ধারণা?
ডিটিআই-ম্যাট

18
আমার জন্য কাজ করেনি। একটি patch does not applyত্রুটি পেয়েছি ।
জেরি সারাভিয়া

13
আপনি পেয়ে থাকেন @bronson পয়েন্ট আউট হিসাবে প্রেক্ষাপটে হোয়াইটস্পেস কারণে 'প্যাচ ব্যর্থ', এই সংশোধিত কমান্ডটি কার্যকরী (এটা কোন প্রসঙ্গকে একটি প্যাচ উত্পন্ন): git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero। এটি ঝুঁকিপূর্ণ নয় কারণ সূচকটি ইতিমধ্যে যতটা আপ-টু ডেট হতে পারে তাই এটি প্যাচটির জন্য একটি নির্ভরযোগ্য বেস।
void.pointer

36

এটি আমার পক্ষে কাজ করে:

আপনি যদি কোনও আশেপাশে লুকিয়ে রাখতে চান তবে এটি কাজ করে

git stash && git stash apply && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch

আমি stashes পছন্দ না, কিন্তু আমি করেছি Git + + cygwin যেখানে আমি পরিবর্তন হারাবেন, তাই নিশ্চিত করুন যে কাপড় reflog অন্তত আমি নিম্নলিখিত সেট আপ করার জন্য গিয়েছিলাম করার জন্য একটি বাগ মধ্যে চালানো:

git add . && git commit -am 'tmp' && git reset HEAD^ && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch

মূলত আমরা একটি পৃথক তৈরি করি যা স্থান পরিবর্তনগুলি অন্তর্ভুক্ত করে না, আমাদের সমস্ত পরিবর্তনগুলি ফিরিয়ে দেয় এবং তারপরে ভিন্নতা প্রয়োগ করে।


1
+1 টি। আপনি git stashচেকআউটের পরিবর্তে একটি পরিবর্তন করতে চান, আপনার পরিবর্তনের ব্যাকআপ নিতে চান, কমপক্ষে এটি পরীক্ষা না হওয়া পর্যন্ত।
পাওলো ইবারম্যান

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

3
আমি কলিনের সাথে একমত স্ক্রিপ্টটি যদি কাজ করে তবে স্ট্যাশ তৈরি করার দরকার নেই। তবে স্ট্যাশ চালানো, তারপরে স্ট্যাশ পপটি বিবেচনা করা ভাল। পপড স্ট্যাশগুলি প্রয়োজনে পুনরুদ্ধার করা যেতে পারে তবে অন্যথায় আপনি প্রচুর স্ট্যাশ দিয়ে শেষ করবেন না। এটি চারপাশে পড়ে থাকা একটি অতিরিক্ত ফাইলও
ফেলেছে

বাইনারি ফাইলগুলি এড়ানো সম্পর্কে কীভাবে? উপরের স্নিপেটটি প্রয়োগ করার চেষ্টা করার সময়, আমি ত্রুটিগুলি পেয়েছি যে প্যাচ সম্পূর্ণ সূচক লাইন ছাড়া প্রয়োগ করা যায় না! আমাকে মারধর করার বিষয়টি হ'ল আমি এই ফাইলগুলি / বাইনারিগুলি প্রথম স্থানে স্পর্শ করি নি!
tver3305

1
আমি মনে করি প্রথম কমান্ডের শেষে "গিট আরএম foo.patch" ঠিক "rm foo.patch" হওয়া উচিত। অন্যথায় খুব সহায়ক ধন্যবাদ।
জ্যাক কেসি

33

কেবলমাত্র আসল পরিবর্তনযুক্ত একটি প্যাচ ফাইল তৈরি করুন (কেবল সাদা স্থানের পরিবর্তনের সাথে রেখাগুলি বাদে), তারপরে আপনার কর্মপরিসরটি পরিষ্কার করুন এবং সেই প্যাচ ফাইলটি প্রয়োগ করুন:

গিট ডিফ> ব্যাকআপ
গিট ডিফ-ডাব্লু> পরিবর্তন
গিট রিসেট --হার্ড
প্যাচ <পরিবর্তনসমূহ

অবশিষ্ট পার্থক্যগুলি পর্যালোচনা করুন, তারপরে addএবং commitসাধারণ হিসাবে।

মার্চুরিয়ালের সমতুল্য এটি করা:

এইচ জি ডিফ> ব্যাকআপ
এইচ জি ডিফ-ডাব্লু> পরিবর্তনগুলি
এইচজি রিভার্ট করুন - সমস্ত
এইচজি আমদানি - কোনও প্রতিশ্রুতিবদ্ধ পরিবর্তন নেই


একটি "সুরক্ষিত" প্রশ্ন কী? এবং আমার খুব উত্তর। আমার মনে হয় না এটি এমনকি আমার উত্তর হিসাবেও যোগ্যতা অর্জন করে কারণ মনে হয় প্রশ্নটি পাতলা বাতাসের বাইরে টানা হয়েছিল ...
jw

4
@jww মূল পোস্টারের প্রশ্নের মূল হ'ল "কীভাবে কেবল সাদা-স্থান পরিবর্তন করতে সোর্স নিয়ন্ত্রণে পরিবর্তন আনা যায়"। ওপি গিট ব্যবহার করছে বলে মনে হয় তবে এটি আমি ব্যবহার করেছি এমন প্রতিটি উত্স নিয়ন্ত্রণ সিস্টেমের ক্ষেত্রেও প্রযোজ্য। এই উত্তরটি সঠিক পদ্ধতিটি দেখায় যদি কেউ মার্কুরিয়াল ব্যবহার করে থাকে। আমি ভাবতে পারি যে অন্য কেউ সুবেশন ইত্যাদি ব্যবহারের জন্য সমাধানের ক্ষেত্রে অবদান রাখতে পারে
স্টিভ

1
@jww এবং @ প্যাগিড: আমি গুরিটের জন্য আমার সমাধান হিসাবে একই পদ্ধতির ব্যবহার করে বিশেষ করে গিটকে সম্বোধন করার জন্য আমার উত্তর সম্পাদনা করেছি। আমার দৃষ্টিতে স্ট্যাকওভারফ্লো আরও একটি কিউ + একটি ফোরামের চেয়ে বেশি - এটি জ্ঞানের ভান্ডার হিসাবেও ভূমিকা রাখে। মূল পোস্টার ব্যতীত অন্য ব্যক্তিরা দেওয়া উত্তরগুলি থেকে উপকৃত হতে পারে এবং তাদের পরিস্থিতি পৃথক হয়। এ কারণেই আমি বিশ্বাস করি যে একটি সাধারণ নীতি জানানো উত্তরগুলি কেবলমাত্র একটি নির্দিষ্ট পরিস্থিতি লক্ষ্য করেই বৈধ valid
স্টিভ পিচারস

@ স্টিভ - "আমি আমার উত্তরটি সম্পাদন করে গিতকে ..." - আপনি কেন পারদর্শী প্রসঙ্গে একটি নতুন প্রশ্ন জিজ্ঞাসা করলেন না, এবং নতুন প্রশ্নের সাথে নিজের উত্তর যুক্ত করলেন কেন ???
jww

8
এটি আমি দেখেছি এমন পদ্ধতির মধ্যে সবচেয়ে পরিষ্কার, সবচেয়ে উপলব্ধিযোগ্য এবং সবচেয়ে অটুট is
Kzqai

12

মন্তব্যে ব্যবহারকারীদের মতে প্যাচ প্রসঙ্গে সাদা অংশের কারণে শীর্ষ-ভোট প্রাপ্ত উত্তরগুলি সব ক্ষেত্রে কার্যকর হয় না।

আমি আদেশটি নিম্নরূপে সংশোধন করেছি:

$ git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero

এটি কোনও প্রসঙ্গ ছাড়াই একটি প্যাচ তৈরি করে। প্যাচটি স্বল্পকালীন হওয়ায় সমস্যা হওয়া উচিত নয়।

অনুরূপ উপন্যাস, আবার অন্য ব্যবহারকারীদের দ্বারা ইতিমধ্যে সরবরাহ করা হয়েছে কি এর একটি সংশোধন:

addw = !sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero' -

কেবলমাত্র ইনডেন্টেশন পরিবর্তনগুলি উপেক্ষা করার জন্য আমাকে তার --ignore-space-changeপরিবর্তে ব্যবহার করতে হয়েছিল -wgit diff -U0 --ignore-space-change --no-color | git apply --cached --unidiff-zero
অ্যান্ডি

এই সুন্দর কোনও প্রসঙ্গ কৌশলটি ব্যবহার না করার জন্য সতর্কতার একটি শব্দ --ignore-blank-linesঅন্যথায় আপনি দেখতে পাবেন যে 'হোয়াইট স্পেস' পরিবর্তনগুলি যে আপনি উপেক্ষা করছেন এমন কিছু যদি ফাঁকা লাইন অপসারণ / সংযোজন হয় তবে ভুল অফসেটগুলিতে পৃথক অংশগুলি পাওয়া যায়।
এলবিয়ারডমোরজ

12

আপনার সাথে নিম্নলিখিতগুলি যুক্ত করুন .gitconfig:

anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"

অনুপ্রেরণার জন্য @ কলিন হারবার্টের জবাবের জন্য ধন্যবাদ ।

সিনট্যাক্স ব্যাখ্যা

চূড়ান্ত #উদ্ধৃতি দিতে হবে সুতরাং এটি এটিকে কোনও মন্তব্য হিসাবে বিবেচনা করা হবে না .gitconfig, বরং এর মধ্যে দিয়ে যায় এবং শেলের ভিতরে একটি মন্তব্য হিসাবে গণ্য হয় - এটি শেষের মধ্যে git applyএবং ব্যবহারকারী দ্বারা সরবরাহ করা যুক্তিগুলির মধ্যে সন্নিবেশ করা হয় যা gitস্বয়ংক্রিয়ভাবে স্থান দেয় কমান্ড লাইনের শেষ। এই যুক্তিগুলি এখানে চাওয়া হয়নি - আমরা git applyসেগুলি গ্রাস করতে চাই না , অতএব পূর্ববর্তী মন্তব্য চরিত্রটি। এটি কার্যকরভাবে GIT_TRACE=1 git anwদেখতে আপনি এই আদেশটি চালাতে চাইতে পারেন ।

--সংকেত আর্গুমেন্ট শেষ এবং আপনি নামের একটি ফাইল আছে যে ক্ষেত্রে জন্য করতে পারবেন -wবা কিছু যে একটি সুইচ মত দেখাবে git diff

আশেপাশের এ্যাস্কেপড ডাবল-কোটগুলির যে $@কোনও ব্যবহারকারীর সরবরাহ করা উদ্ধৃতি যুক্তি সংরক্ষণ করতে হবে। যদি "চরিত্রটি এড়ায় না, এটি .gitconfigপার্সার দ্বারা গ্রাস হবে এবং শেলের কাছে পৌঁছবে না।

নোট: .gitconfigওরফে পার্সিং না চেনে বিশেষ কিছু যেমন একক উদ্ধৃতি - তার শুধুমাত্র বিশেষ অক্ষর ", \, \n, এবং ;(ক বাইরে "-quoted স্ট্রিং)। এ কারণেই "কোনওটিকে সর্বদা পালাতে হবে, এমনকি যদি মনে হয় এটি একক-উদ্ধৃত স্ট্রিংয়ের (যা গিটটি সম্পূর্ণরূপে অজ্ঞাত সম্পর্কিত) inside

এটি গুরুত্বপূর্ণ, যেমন। যদি আপনার bashকার্যক্ষম গাছের গোড়ায় কোনও কমান্ড কার্যকর করার জন্য একটি সহজ ব্যবহারকারীর নাম হয় । ভুল সূত্রটি হ'ল:

sh = !bash -c '"$@"' -

যদিও সঠিকটি হ'ল:

sh = !bash -c '\"$@\"' -

চমৎকার। এটি আমাকে একবারে একটি ফাইল যুক্ত করতে দেয়। একটি আর্গুমেন্টের জন্য মূল ডিরেক্টরি যুক্ত করা ছাড়া, এই কাজটি 'গিট অ্যাড-এ' এর মতো করার কোনও উপায় আছে কি?
চকি

7

নিম্নলিখিতগুলি সম্পর্কে কীভাবে:

git add `git diff -w --ignore-submodules |grep "^[+][+][+]" |cut -c7-`

ব্যাককোটিসের অভ্যন্তরীণ কমান্ডটি এমন ফাইলগুলির নাম পায় যা শ্বেত স্থান পরিবর্তন করে না।


2
বা ঠিক git add `git diff -w |grep '^+++' |cut -c7-`যদি
সাবমডিউলগুলি

-1

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

একটি শালীন সম্পাদক পান এবং লাইনের শেষে সাদা স্থান ছেড়ে যাবেন না।

আপনার ক্ষেত্রে, সমস্যাটি অন্যান্য উপায়ে রয়েছে: পূর্ববর্তী প্রতিশ্রুতি (এবং সম্ভবত বর্তমানগুলি) এই নির্দেশিকাটি অনুসরণ করেনি।

আমি বাজি রেখেছিলাম যে সত্যিই কেউ পেছনের শ্বেত স্পেস চায় না এবং সমস্যা সমাধান করা একটি স্বাগত পরিবর্তন হতে পারে। অন্যান্য ব্যবহারকারীরাও আপনি একই সমস্যার মুখোমুখি হতে পারেন। এটিও সম্ভবত সম্ভব যে অবদানকারীরা (যারা) পূর্ববর্তী সাদা স্থান যুক্ত করছেন তারা অবহিত আছেন যে তারা এটি করছেন।

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


16
এটি ইচ্ছাকৃত নয়, তবে প্রকল্পের অবদানকারী 100+ লোকেরা যেভাবে ভাবেন সেভাবে আমি পরিবর্তন করতে পারি না। তারা কিছু মনে করলাম না, আর 1000+ পরিবর্তন কি কেবল সাদা ব্যবধান trailing সাথে মোকাবিলা সঙ্গে প্যাচ গ্রহণ করবে না। তারা সমস্যাটি সম্পর্কে জানেন এবং এটিকে উপেক্ষা করার সিদ্ধান্ত নিয়েছেন। এই আলোচনা ইতিমধ্যে তালিকায় ঘটেছিল এবং এটি বন্ধ ছিল। এই ক্ষেত্রে, আমিই তাদের সাথে খাপ খাইয়ে নেওয়ার দরকার।
এডু ফেলিপ

19
তারপরে আপনার সম্পাদককে এমনভাবে কনফিগার করুন যাতে এই প্রকল্পের কোডটিতে কাজ করার সময় শ্বেত স্পেসটি ট্রিম করে না।
জামেসান

-2

আমি একটি গিট প্রাক কমিট হুক পেয়েছি যা পেছনের সাদা স্থানটিকে সরিয়ে দেয় । তবে, আপনি যদি অন্যকে এটি ব্যবহার করতে না পারেন, তবে এটি কোনও বৈধ সমাধান হতে পারে না।

  #!/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"
  done
  exit

4
এই প্রশ্নটি জিজ্ঞাসা করছে যে কীভাবে পশ্চাদ্বাবক শ্বেতস্থান সংরক্ষণ করবেন।
ডগলাস

@ ডগলাস: সম্ভবত এই উত্তরটি কোনও অস্থায়ী শাখায় প্রতিশ্রুতি তৈরি করতে, সেখানে সত্যিকারের প্যাচটি প্রতিশ্রুতিবদ্ধ করতে এবং চেরি-কে কেবলমাত্র কার্যকরী শাখায়
আলাদা করে নিতে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.