केवल गैर-व्हाट्सएप परिवर्तन जोड़ें


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बिना व्हाट्सएप के बदलाव के साथ लागू किया जाएगा । आप देखेंगे कि इसके बाद 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
मुझे लगता है कि पहले कमांड के अंत में "git rm foo.patch" सिर्फ "rm foo.patch" होना चाहिए। अन्यथा बहुत मददगार धन्यवाद।
जैक केसी

33

एक पैच फ़ाइल बनाएं जिसमें केवल वास्तविक परिवर्तन हों (केवल व्हाट्सएप परिवर्तन के साथ लाइनों को छोड़कर), फिर अपने कार्यक्षेत्र को साफ़ करें और पैच फ़ाइल को लागू करें:

git diff> backup
git diff -w> परिवर्तन
git रीसेट - भार
पैच <परिवर्तन

शेष मतभेद है, तो समीक्षा करें addऔर commitसामान्य रूप में।

यह करने के लिए मर्क्यूरियल के बराबर है:

hg diff> backup
hg diff -w> बदलाव
hg revert --all
hg import --no-प्रतिबद्ध परिवर्तन


"संरक्षित" प्रश्न क्या है? और मुझे भी जवाब देता है। मुझे नहीं लगता कि यह मेरे लिए भी उत्तीर्ण है, क्योंकि यह ऐसा प्रतीत होता है कि प्रश्न पतली हवा से बाहर निकाला गया था ...
jav

4
@jww मूल पोस्टर के सवाल का मूल है "सफेद-कमिट करने से कैसे बचें केवल स्रोत नियंत्रण में परिवर्तन"। ओपी जीआईटी का उपयोग करने के लिए होता है, लेकिन यह मेरे द्वारा उपयोग किए जाने वाले हर स्रोत नियंत्रण प्रणाली पर भी लागू होता है। यह उत्तर सही प्रक्रिया को दिखाता है यदि कोई मर्क्यूरियल का उपयोग करता है। मैं कल्पना कर सकता हूं कि कोई और व्यक्ति भी Sublesion, आदि का उपयोग करने वाले लोगों के लिए एक समाधान का योगदान दे सकता है
स्टीव पिचर्स

1
@jww और @ पगिड: मैंने अपने उत्तर को विशेष रूप से Git को संबोधित करने के लिए संपादित किया, Mercurial के लिए मेरे समाधान के समान दृष्टिकोण का उपयोग करते हुए। मेरे विचार में, StackOverflow केवल एक और Q + A मंच से अधिक है - इसमें ज्ञान के भंडार के रूप में भी एक भूमिका है। मूल पोस्टर के अलावा अन्य लोग दिए गए उत्तरों से लाभान्वित हो सकते हैं, और उनकी परिस्थितियां भिन्न हो सकती हैं। इसलिए मेरा मानना ​​है कि केवल एक विशिष्ट स्थिति को लक्षित करने के बजाय एक सामान्य सिद्धांत को व्यक्त करने वाले उत्तर मान्य हैं।
स्टीव पिचर्स

@Steve - "मैंने विशेष रूप से Git को संबोधित करने के लिए अपने उत्तर को संपादित किया ..." - आपने भाड़े के संदर्भ में एक नया प्रश्न क्यों नहीं पूछा, और फिर नए प्रश्न के लिए अपना स्वयं का उत्तर जोड़ें ???
jww

8
यह वास्तव में मेरे द्वारा देखे गए दृष्टिकोणों में सबसे साफ, सबसे समझने योग्य और सबसे अटूट है।
क्ज़िकई

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अगर आपको लगता है कि कुछ 'सफ़ेद स्थान' परिवर्तन जिन्हें आप अनदेखा कर रहे हैं, खाली लाइन हटाने / जोड़ने के लिए देख रहे हैं, तो आपको गलत ऑफ़सेट में पैच किए जा रहे हैं।
elbeardmorez

12

निम्नलिखित को अपने में जोड़ें .gitconfig:

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

प्रेरणा के लिए @Colin हर्बर्ट के जवाब के लिए धन्यवाद ।

सिंटेक्स स्पष्टीकरण

अंतिम #रूप से उद्धृत किया जाना चाहिए, इसलिए इसे अंदर की टिप्पणी के रूप में नहीं माना .gitconfigजाता है, बल्कि इसके माध्यम से पारित हो जाता है और इसे शेल के अंदर एक टिप्पणी के रूप में माना जाता है - यह स्वचालित रूप से जगह पर होने वाले git applyऔर उपयोगकर्ता द्वारा दिए गए तर्कों के अंत के बीच डाला जाता gitहै कमांड लाइन का अंत। ये तर्क यहां नहीं चाहिए - हम git applyउनका उपभोग नहीं करना चाहते , इसलिए पूर्ववर्ती टिप्पणी चरित्र। आप इस आदेश को GIT_TRACE=1 git anwइस क्रिया में देखने के लिए चलाना चाह सकते हैं ।

--संकेत बहस के अंत और आप नाम की एक फ़ाइल है कि मामले के लिए अनुमति देता है -wया कुछ है कि करने के लिए एक स्विच की तरह लग रहे हैं git diff

$@किसी भी उपयोगकर्ता द्वारा दिए गए उद्धृत तर्कों को संरक्षित करने के लिए आस-पास के डबल-कोट्स की आवश्यकता होती है। यदि "चरित्र बच नहीं जाता है, तो यह .gitconfigपार्सर द्वारा खाया जाएगा और शेल तक नहीं पहुंचेगा।

नोट: .gitconfigउर्फ पार्स को नहीं पहचानता है कुछ भी विशेष रूप एकल उद्धरण - इसके केवल विशेष वर्ण हैं ", \, \n, और ;(एक के बाहर "-quoted स्ट्रिंग)। यही कारण है कि "हमेशा बच जाना चाहिए, भले ही ऐसा लगता है कि यह एकल-उद्धृत स्ट्रिंग के अंदर है (जो कि गिट पूरी तरह से अज्ञेय है)।

यह महत्वपूर्ण है, उदाहरण के लिए। यदि आपके पास bashवर्किंग ट्री के रूट में कमांड निष्पादित करने के लिए एक आसान उपनाम है । गलत सूत्रीकरण है:

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

जबकि सही एक है:

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

अति उत्कृष्ट। इसने मुझे एक बार में एक फ़ाइल जोड़ने की अनुमति दी। एक तर्क के लिए रूट डायरेक्टरी को जोड़ने के अलावा, क्या यह काम 'git add -A' बनाने का एक तरीका है?
चंकी

7

निम्नलिखित के बारे में कैसे:

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

Backquotes के अंदर कमांड को उन फ़ाइलों का नाम मिलता है जिनमें गैर-व्हाट्सएप परिवर्तन होते हैं।


2
या बस git add `git diff -w |grep '^+++' |cut -c7-`अगर
सबमॉड्यूल्स का

-1

आपको पहले विचार करना चाहिए कि क्या अनुगामी व्हाट्सएप जानबूझकर है। लिनक्स कर्नेल, मोज़िला, ड्रुपल, और केर्बरोस (स्टाइल पर विकिपीडिया पृष्ठ से कुछ का नाम लेने के लिए) सहित कई परियोजनाएँ अनुगामी व्हाट्सएप को प्रतिबंधित करती हैं। लिनक्स कर्नेल प्रलेखन से:

एक सभ्य संपादक प्राप्त करें और लाइनों के अंत में व्हाट्सएप न छोड़ें।

आपके मामले में, समस्या दूसरी तरह से है: पिछले दिशानिर्देश (और शायद वर्तमान वाले) ने इस दिशानिर्देश का पालन नहीं किया।

मैं चाहता हूं कि कोई भी वास्तव में अनुगामी व्हाट्सएप नहीं चाहता है, और समस्या को ठीक करना एक स्वागत योग्य बदलाव हो सकता है। अन्य उपयोगकर्ता भी वही समस्या अनुभव कर रहे होंगे जो आप कर रहे हैं। यह भी संभावना है कि योगदानकर्ता (एस) जो अनुगामी व्हाट्सएप जोड़ रहे हैं वे इस बात से अनजान हैं कि वे ऐसा कर रहे हैं।

समस्या को अनदेखा करने या अपने संपादक में अन्यथा वांछनीय कार्यक्षमता को अक्षम करने के लिए git को पुन: कॉन्फ़िगर करने की कोशिश करने के बजाय, मैं समस्या को समझाते हुए प्रोजेक्ट मेलिंग सूची में एक पोस्ट के साथ शुरू करूँगा। कई संपादकों (और खुद ही) को व्हाट्सएप के पीछे आने से निपटने के लिए कॉन्फ़िगर किया जा सकता है।


16
यह जानबूझकर नहीं है, लेकिन मैं इस तरह से 100+ लोगों को नहीं बदल सकता जो परियोजना में योगदान करते हैं। वे इसे बुरा नहीं मानते हैं, और 1000+ बदलावों के साथ पैच स्वीकार नहीं करेंगे जो केवल अनुगामी व्हाट्सएप के साथ सौदा करते हैं। उन्होंने समस्या के बारे में जाना और इसे अनदेखा करने का फैसला किया। यह चर्चा पहले से ही सूची में थी और इसे बंद कर दिया गया था। इस मामले में, यह मेरे लिए है जो उनके अनुकूल होना चाहिए।
एडु फेलिप

19
फिर अपने संपादक को इस तरह कॉन्फ़िगर करें कि वह इस प्रोजेक्ट के कोड पर काम करते समय अनुगामी व्हाट्सएप को ट्रिम न करें।
जैमेसन

-2

मुझे एक git प्री-कमिट हुक मिला, जो ट्रेसिंग व्हाट्सएप को हटाता है । हालाँकि, यदि आप दूसरों को इसका उपयोग करने के लिए नहीं कर सकते हैं, तो यह एक वैध समाधान नहीं हो सकता है।

  #!/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
यह सवाल पूछ रहा है कि अनुगामी व्हॉट्सएप को कैसे संरक्षित किया जाए।
डगलस

@ डगलस: कोई शायद इस जवाब का इस्तेमाल एक अस्थायी शाखा पर
कमेटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.