2009-11-17 5 views
10

बिंदु परिवर्तन से मिलकर पिछली श्वेत रिक्ति है कि हर कोई यह करता है, तो हमेशा तो आप एक diff कि कम है, यानी साथ में पहुंचते हैं। इसमें केवल कोड परिवर्तन होते हैं और व्हाइटस्पेस परिवर्तन नहीं होते हैं।Git उपकरण के मंचन से लाइनों को हटाने के लिए अगर वे दूर करने में ही में खाली स्थान के

हालांकि, अन्य लोगों के साथ काम करते समय, जो इस अभ्यास का अभ्यास नहीं करते हैं, अपने संपादक के साथ सभी पिछली सफेद जगहों को हटाकर या पूर्व-प्रतिबद्ध हुक परिणाम में भी खराब diff। आप अपने इरादे के विपरीत कर रहे हैं।

अगर वहाँ एक उपकरण है कि मैं मैन्युअल रूप से चला सकते हैं इससे पहले कि मैं प्रतिबद्ध है इसलिए मैं यहाँ पूछ रहा हूँ कि कि खाली स्थान के में केवल परिवर्तन कर रहे हैं मचान से unstages लाइनों।

इसके अलावा एक बोनस लाइनों कोड में परिवर्तन है कि के लिए हटाया खाली स्थान के अनुगामी के लिए मंचन लाइन बदलने के लिए किया जाएगा।

इसके अलावा एक बोनस Markdown फ़ाइलों को ऐसा नहीं करने के लिए (के रूप में अंतरिक्ष अनुगामी Markdown में अर्थ नहीं है) होगा।

मैं यहां पूछ रहा हूं क्योंकि मैं इस उपकरण को लिखने का इरादा रखता हूं यदि यह पहले से मौजूद नहीं है।

+0

दिलचस्प सवाल। एक उपयोगी उपकरण की तरह लगता है अगर यह पहले से मौजूद नहीं है। एक बहुत मुश्किल पार्सिंग समस्या नहीं है, लेकिन हमें बताएं कि आप क्या कर रहे हैं। –

+0

बस एफवाईआई, आपके गिट संस्करण को बंपिंग करने से व्हाइटस्पेस मुद्दे अधिक प्रबंधनीय हो सकते हैं। यह मेरे लिए काम किया। मेरा प्रश्न यहां देखें: http://stackoverflow.com/questions/1316364/git-whitespace-woes * मुस्कान * – Kzqai

+0

@ मैक्स मेरे उत्तर में वर्णित व्यवहार v1.7.0 रिलीज़ में है: http: //www.kernel। संगठन/पब/सॉफ्टवेयर/एसएमएम/गिट/डॉक्स/रिलेनोट्स- 1.7.0.txt –

उत्तर

8

निम्नलिखित आपको इस प्रक्रिया का सबसे मिल जाएगा:

$ clean=`git diff --cached -b`; \ 
    git apply --cached <(git diff --cached -R); \ 
    echo "$clean" | git apply --cached -; \ 
    clean=

Git की विज्ञप्ति 1.7.0 से पहले के लिए, यह विफल रहता है एक या अधिक फ़ाइलों सब-सफ़ेद बदलाव हैं। उदाहरण

$ git diff --cached -b 
diff --git a/file1 b/file1 
index b2bd1a5..3b18e51 100644 
diff --git a/file2 b/file2 
new file mode 100644 
index 0000000..092bfb9 
--- /dev/null 
+++ b/file2 
[...]

(file1 के ऊपर, जो वास्तव में दबा होना चाहिए) खाली डेल्टा के लिए git-apply दुखी बनाता है:

fatal: patch with only garbage at line 3

अद्यतन: Git fixes this issue की 1.7.0 रिलीज।

कहो हमारे भंडार निम्नलिखित अवस्था में है:

$ git diff --cached 
diff --git a/foo b/foo 
index 3b18e51..a75018e 100644 
--- a/foo 
+++ b/foo 
@@ -1 +1,2 @@ 
-hello world 
+hello world 
+howdy also

हम तो सूचकांक और काम पेड़ कांटा करने के लिए ऊपर कमांड चलाने सकता है:

$ git diff --cached 
diff --git a/foo b/foo 
index 3b18e51..1715a9b 100644 
--- a/foo 
+++ b/foo 
@@ -1 +1,2 @@ 
hello world 
+howdy also 

$ git diff 
diff --git a/foo b/foo 
index 1715a9b..a75018e 100644 
--- a/foo 
+++ b/foo 
@@ -1,2 +1,2 @@ 
-hello world 
+hello world 
howdy also

सभी परिवर्तनों-इसमें केवल रिक्त स्थान रखते हैं, आप

error: No changes

मैं सूचकांक फिक्सिंग और काम में अवांछित परिवर्तन छोड़ने पर शक देखेंगे पेड़ ज्यादातर उपयोगकर्ताओं को आश्चर्यचकित करेगा या यहां तक ​​कि परेशान करेगा, लेकिन यह सवाल है कि सवाल पूछा गया है।

+0

क्या अद्यतन कह रहा है कि यह व्हाइटस्पेस परिवर्तनों में और असफल नहीं होता है? – rjmunro

+0

@rjmunro हाँ! अद्यतन उत्तर देखें (पुनः)। –

2

मैं वर्षों के लिए @GregBacon's answer के आधार पर एक स्क्रिप्ट का उपयोग किया गया था, लेकिन कुछ बिंदु Git पर git diff -b के उत्पादन में बदल इतना है कि खाली स्थान के बदलता है यह दिखाई नहीं दिया के रूप में परिवर्तन राज्य के बाद में पैच संदर्भ लाइनों में शामिल थे पहले राज्य की बजाय।

मुझे पता चला कि मैंने साफ अंतर और संबंधित आवेदन को उलट दिया है, तो स्क्रिप्ट फिर से काम करेगी।

तो मेरा पूरा इस तरह देखने के लिए प्रयोग किया जाता है स्क्रिप्ट:

#!/bin/bash 

clean=`git diff --cached -b` 
git apply --cached <(git diff --cached -R) 
echo "$clean" | git apply --cached - 
clean= 

और अब लगता है कि:

#!/bin/bash 

clean=`git diff --cached -b -R` 
git apply --cached <(git diff --cached -R) 
echo "$clean" | git apply --cached -R - 
clean= 

मैं भी एक प्रतिबद्ध में केवल रिक्त स्थान परिवर्तन को छोड़ने के लिए एक स्क्रिप्ट है। यह तब उपयोगी होता है जब आप कुछ ठीक करते हैं तो आप फ़ाइल में कहीं और कुछ सफेद जगह तय करते हैं, और आप एक अलग प्रतिबद्धता में पहले व्हाइटस्पेस फ़िक्स को प्रतिबद्ध करना चाहते हैं। यह सिर्फ है:

git apply --cached -R <(git diff --cached -w) 
4

Git 1.7.2.5 पर मेरे समाधान किया गया था के रूप में निम्नानुसार (शुरू करने बिना किसी भी परिवर्तन का मंचन किया):

git diff -w > temp.patch 
git stash 
git apply --ignore-space-change --ignore-whitespace temp.patch 
# tidy up: 
rm temp.patch 
git stash drop 

यह किसी भी रिक्त स्थान के साथ शुरू करने से राज्य में वापस अपने रेपो छोड़ देता है केवल परिवर्तन हटा दिए गए।

फिर आप सामान्य रूप से अपने परिवर्तनों को मंचित कर सकते हैं।

+0

यह विशेष रूप से उपयोगी होता है जब आपने दो परिवर्तन किए हैं जिन्हें "गिट एड-पी" * द्वारा विभाजित किया जाना चाहिए और * आपने व्हाइटस्पेस परिवर्तन भी किए हैं। – MKaras