कमिट करने से पहले गेट को स्वचालित रूप से पीछे वाले व्हाट्सएप को हटा दें


220

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

मैंने ~/.gitconfigफ़ाइल द्वारा निम्नलिखित जोड़ने की कोशिश की है, लेकिन जब मैं कुछ करता हूं तो यह कुछ भी नहीं करता है। शायद यह कुछ अलग के लिए डिज़ाइन किया गया है। इसका क्या उपाय है?

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

मैं रूबी का उपयोग कर रहा हूँ अगर किसी के पास कोई रूबी विशिष्ट विचार है। स्वचालित कोड प्रारूपण करने से पहले अगला चरण होगा, लेकिन यह एक कठिन समस्या है और वास्तव में एक बड़ी समस्या नहीं है।


यदि core.whitespace निर्देश आपके मुद्दों को ठीक नहीं करता है, तो आप उन्हें खोजने और उन्हें ठीक करने के लिए पूर्व-प्रतिबद्ध हुक (.it / हुक / पूर्व-प्रतिबद्ध) को भी बदल सकते हैं। विस्तृत विवरण के लिए इस पोस्ट को देखें ।
वोल्का

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लिपि (जैसे इस एक ), है एक विशेषता "अनुगामी हटाने" ", लेकिन एक" चेतावनी "सुविधा की तरह:

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

हालाँकि आप एक बेहतर pre-commitहुक का निर्माण कर सकते हैं , खासकर जब आप इस पर विचार करते हैं:

स्टेजिंग क्षेत्र में जोड़े गए केवल कुछ परिवर्तनों के साथ जीआईटी में प्रतिबद्ध होने के बाद भी एक "परमाणु" संशोधन होता है जो कभी भी एक कार्यशील प्रतिलिपि के रूप में मौजूद नहीं हो सकता है और काम नहीं कर सकता है


उदाहरण के लिए, oldman का प्रस्ताव एक और जवाब में एक pre-commitहुक जो पहचान लेता है तथा निकालें खाली स्थान के।
चूंकि उस हुक को प्रत्येक फ़ाइल का फ़ाइल नाम मिलता है, इसलिए मैं कुछ विशेष प्रकार की फाइलों के लिए सावधान रहने की सलाह दूंगा: आप .md(मार्कडाउन) फाइलों में ट्रेसिंग व्हाट्सएप को हटाना नहीं चाहते हैं !


1
आपके वर्किंग कॉपी apply.whitespaceचेंज को पैच के रूप में ट्राई करने से आपकी वर्क कॉपी में व्हाट्सएप को ठीक करने के लिए टर्न आउट गिट को आश्वस्त किया जा सकता है । देखें नीचे मेरा उत्तर
ntc2

> "आप .md (मार्कडाउन) फ़ाइलों में पीछे वाले व्हाट्सएप को हटाना नहीं चाहते हैं" - ऐसा क्यों है? मार्कडाउन फ़ाइलों में व्हाट्सएप को पीछे करने का उद्देश्य क्या है? मैंने देखा कि कुछ .editorconfigफाइलों के लिए एक विशिष्ट नियम है।
फ्राइडेरब्लुमेले

5
@friederbluemle, मार्कडाउन के प्रकार के आधार पर, एक अनुगामी दोहरा स्थान इंगित करता है <br>: github.com/FriendsOfPHP/PHP-CS-Fixer/issues/…
VONC

स्थापना core.whitespaceके trailing-spaceसाथ git configत्रुटि में करने से बढ़ा नहीं है git2.5.0।
कार्ल रिक्टर

43

आप पैच के रूप में अपने परिवर्तनों का इलाज करने में गिट को धोखा देकर, आपके लिए व्हाट्सएप को ठीक करने में चाल कर सकते हैं। "पूर्व-प्रतिबद्ध हुक" समाधानों के विपरीत, ये समाधान गिट्स में व्हाट्सएप-फिक्सिंग कमांड जोड़ते हैं।

हां, ये हैक हैं।


मजबूत समाधान

निम्नलिखित गिट उपनाम मेरे~/.gitconfig से लिया गया है ।

"मजबूत" से मेरा मतलब है कि ये उपनाम त्रुटि के बिना चलते हैं, सही काम करते हैं, भले ही पेड़ या सूचकांक गंदा हो। हालाँकि, वे काम नहीं करते हैं अगर एक इंटरैक्टिव 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"

Unversioned फ़ाइलों में व्हॉट्सएप को ठीक करने के लिए भी करें

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

सरल लेकिन मजबूत समाधान नहीं

इन संस्करणों को कॉपी और पेस्ट करना आसान है, लेकिन अगर उनकी साइड की शर्तों को पूरा नहीं किया जाता है तो वे सही काम नहीं करते हैं।

वर्तमान निर्देशिका में निहित उप-पेड़ को ठीक करें (लेकिन यदि यह खाली नहीं है तो सूचकांक रीसेट करता है)

का उपयोग 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 को मनाएं :

    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 के कारण है
VonC

@VonC स्थायी रूप से उस परेशान विसिट को नहीं देखेगा, जो git commitगलत संपादक के उपयोग के बाद के उपयोग का कारण हो सकता है ? मैं इससे VISUAL=बचने के लिए ऊपर दिए गए अपने यूनिक्स संस्करण में एक उप-भाग में लपेटता हूं, लेकिन मुझे यह नहीं पता है कि क्या डॉस की सदस्यता है।
ntc2

1
महान हैक के लिए धन्यवाद! FYI करें, यदि आपने core.editorसेट किया है, तो निर्यात VISUALपर कोई प्रभाव नहीं पड़ता है, क्योंकि कॉन्फ़िगरेशन सेटिंग प्रति वरीयता लेता है man git-var। इसे ओवरराइड करने के लिए आपको GIT_EDITOR=:इसके बजाय निर्यात करने की आवश्यकता है ।
निक फेल्ट

1
इसके अलावा, मैंने fixwsतेजी से विफल होने के अपने संस्करण को फिर से शुरू किया यदि आप पहले से ही एक इंटरैक्टिव विद्रोह में हैं, अन्यथा यह git rebase --whitespace=fixलाइन में मर जाएगा और आपको एक अजीब स्थिति में छोड़ देगा। मैंने इस सवाल से उधार लिया था और अगर I से पहले एक अतिरिक्त मामला जोड़ दिया: 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

मुझे एक 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"
   git add "$FILE"
done
exit

3
दूसरा sedमंगलाचरण ( sed -r 's/:[0-9]+:.*//') के साथ प्रतिस्थापित किया जा सकता है cut -f1 -d:। यह लिनक्स और बीएसडी दोनों प्लेटफार्मों पर समान काम करना चाहिए।
इहर कहारलिचेंको

2
@IhorKaharlichenko: वास्तव में, का उपयोग cutकरना उतना सुरक्षित नहीं है जितना दूसरा sed: कट फाइलनाम के "अत्यधिक संभावनाहीन " मामले में विफल होगा जिसमें ":" शामिल हैं। आप awk 'NF>2{NF-=2}1'सुरक्षित होने के लिए उपयोग कर सकते हैं
MestreLion

1
BTW, यदि आप विंडोज (msysgit) पर हैं और उपयोग करते हैं core.autocrlf=true, तो आप dos2unix -D "$FILE"sed के बाद लूप के लिए जोड़ना चाह सकते हैं । अन्यथा, यह केवल सीएडी जारी करके सभी सीआरएलएफ को एलएफ में बदल देगा।
जकूब .g

49
git addएक कमिट हुक के अंदर करना मुझे बहुत बुरा लगता है। यदि आप किसी फाइल का आंशिक मंचन / कमिटिंग कर रहे हैं तो क्या होगा? आप नहीं चाहते कि पूरी फाइल आपकी पीठ के पीछे हो, क्या आप?
स्टेफन

19

मैक ओएस (या, संभावना है, किसी भी बीएसडी) पर, sed कमांड पैरामीटर थोड़ा अलग होना चाहिए। इसे इस्तेमाल करे:

#!/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 प्रतिबद्ध हुक के माध्यम से - वैश्विक सेटिंग्स ) आप इसे $GIT_PREFIX/git-core/templates/hooks(जहाँ GIT_PREFIX / usr या / usr / स्थानीय या usr / शेयर या / ऑप्ट / स्थानीय / शेयर) में रख सकते हैं और git initअपने मौजूदा भंडार के अंदर चला सकते हैं।

के अनुसार git help init:

मौजूदा रिपॉजिटरी में रनिंग इनिट सुरक्षित है। यह उन चीजों को अधिलेखित नहीं करेगा जो पहले से ही हैं। पुनर्मूल्यांकन git init का प्राथमिक कारण नए जोड़े गए टेम्पलेट्स को चुनना है।


7
क्या यह हुक कार्यशील फ़ाइल को संशोधित नहीं कर रहा है और संशोधित कार्यशील फ़ाइल के साथ सूचकांक को अधिलेखित कर रहा है? यदि आप अपने सूचकांक का निर्माण करने के लिए 'git add -p' कर रहे थे, तो यह कमिट हुक उसे उड़ा देगा।
मैथ्यू डट्टन

2
हाँ, तुम शायद सही हो। किसी को इस स्क्रिप्ट का उपयोग करने के लिए फिर से लिखना पड़ सकता है git hash-object -wऔर git update-index(फिर से) मुंग वाली फ़ाइल को सीधे सूचकांक में सम्मिलित करना होगा। कोई बहुत बहादुर।
एलेक्साचेफी

11

मैं इस कार्य को आपके पसंदीदा संपादक को छोड़ दूंगा।

बचत करते समय ट्रेलिंग स्पेस को हटाने के लिए बस एक कमांड सेट करें।


2
Vim में आप इसके साथ यह कर सकते हैं: autocmd BufWritePre .cpp, .c, * .c।, *। H:% / \ s \ + $ // e
रॉबर्ट मैसैओली

3
क्षमा करें, मैंने परीक्षण करने से पहले उपरोक्त टिप्पणी को गलत ठहराया। प्रतिशत के संकेत के बाद एक लापता "s" है, और यह व्हाट्सएप के पाए जाने पर कर्सर को चारों ओर ले जाएगा, और यह अंतिम खोज पैटर्न को हटा देगा। बेहतर विकल्पों के लिए vim.wikia.com/wiki/Remove_unwanted_spaces देखें ।
सेठ जॉनसन

1
Emacs में यह Mx डिलीट-ट्रेलिंग-व्हाट्सएप है।
मावी लेडफोर्ड

2
Emacs के लिए अभी भी बेहतर है, (add-hook 'before-save-hook 'delete-trailing-whitespace)अपनी .emacsफ़ाइल में जोड़कर सहेजने से पहले अनुगामी व्हाट्सएप को हटाने के लिए एक हुक सेट करें । Emacs व्हाट्सएप ट्रिक्स
डंकन पार्क

1
मैं (ऐड-हुक 'से पहले-सेव-हुक' व्हॉट्सएप-क्लीनअप) का उपयोग करता हूं जो टैब को स्पेस में भी परिवर्तित करता है।
निल्स फेजरबर्ग

10

गिट विशेषताओं का उपयोग करना, और git config के साथ सेटअप फ़िल्टर करना

ठीक है, यह इस समस्या को हल करने के लिए एक नया सौदा है ... मेरा दृष्टिकोण किसी भी हुक का उपयोग नहीं करना है, बल्कि फिल्टर और गिट विशेषताओं का उपयोग करना है। यह आपको क्या करने की अनुमति देता है, सेटअप है, प्रत्येक मशीन पर आप विकसित करते हैं, फ़िल्टर का एक सेट जो फ़ाइलों को समाप्त करने से पहले फ़ाइलों के अंत में सफेद स्थान और अतिरिक्त रिक्त लाइनों को छीन लेगा। फिर एक .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

Sed स्क्रिप्टिंग मैजिक जोड़ें

अंत में, fixup-eol-eofस्क्रिप्ट को अपने पथ पर कहीं रखें, और इसे निष्पादन योग्य बनाएं। स्क्रिप्ट मक्खी संपादन पर कुछ करने के लिए sed का उपयोग करती है (लाइनों के अंत में रिक्त स्थान और रिक्त स्थान हटा दें, और फ़ाइल के अंत में बाहरी खाली लाइनें)

इस तरह दिखना चाहिए:

#!/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 पर नोटों से एक साथ सिल दिया है । ऐसा लगता है कि इसे एक शेल स्क्रिप्ट में डाला जाना चाहिए, मैं समझ नहीं पा रहा था कि फाइल के अंत में एक्सट्रांसस अतिरिक्त लाइनों की स्वच्छता सहित सीधे git-config फाइल में सेड कमांड को कैसे इंजेक्ट किया जाए। (आप CANहालांकि, अलग-अलग सेड स्क्रिप्ट की आवश्यकता के बिना ट्रेसिंग ब्लैंक से छुटकारा पाएं, बस filter.fix-eol-eofकुछ ऐसा सेट करें sed 's/[ \t]*$//' %fजहां \tटैब दबाकर वास्तविक टैब है।)

आवश्यकता = सही कारण से कोई त्रुटि उत्पन्न होती है यदि कुछ गलत हो जाता है, तो आपको परेशानी से बाहर रखने के लिए।

कृपया मुझे माफ़ करें अगर git से संबंधित मेरी भाषा अभेद्य है। मुझे लगता है कि मेरे पास अवधारणाओं की काफी अच्छी समझ है लेकिन मैं अभी भी शब्दावली सीख रहा हूं।


दिलचस्प दृष्टिकोण। +1
VONC

धन्यवाद @VonC! मैं इस मौके को भी इंगित करना चाहता हूं कि गिट विशेषताओं को .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। खाली पेड़ की गणना के लिए मेरा अन्य उत्तर देखें ।
VonC

1
अच्छा विचार है, यह वही है जो मैं चाहता हूं। हालांकि, इसका उपयोग करते समय सावधान रहें! मेरे लिए OSX और git वर्जन 2.3.5 पर यह किसी भी ऐड को उड़ा देता है, लेकिन अनकम्फर्टेबल बदलावों का मैंने मंचन किया है। मैं अभी भी इस के लिए एक काम कर समाधान में दिलचस्पी होगी।
कैस्पर

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(-)

1
दिलचस्प। +1। मैंने अपने जवाब
वॉन

@VonC आपके प्रतिज्ञान के लिए धन्यवाद! '.Md' के लिए, मैंने केवल पाया git commit -no-verify, किसी भी तरह की suststions?
बूढ़े

मैं हुक को .mdफ़ाइल का पता लगाने और व्हाट्सएप को हटाने में सक्षम नहीं बनाऊंगा, बल्कि अंतिम उपयोगकर्ता से एक --no-verifyविकल्प जोड़ने के लिए कहूंगा git commit
VonC

अगर एक फ़ाइल / निर्देशिका जो एक +या-
Rody Oldenhuis

6

यहाँ एक ubuntu + mac os x संगत संस्करण है:

#!/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

मज़े करो


ऐसा लगता है कि आपके और मेरे बीच एकमात्र अंतर यह है कि आप जाँचते हैं कि फ़ाइल को दोबारा लिखने से पहले sed वास्तव में किसी चीज़ को बदल देगा ... मुझे यकीन नहीं है कि चूंकि git परिवर्तन नहीं करता है जो वास्तव में कुछ भी नहीं बदलता है। मुझे लगता है कि यह मामूली सुरक्षित है, लेकिन यह भी थोड़ा धीमा है, और मैं एक लाइन पर दो बार regexes को नहीं दोहराने की स्पष्टता पसंद करता हूं। दे गस्टिबस नॉन डिस्प्यूटैंडम इस्ट!
एलेक्साचैफ़ी

कोई अंतर नहीं है कि संस्करण पहले ubuntu सिंटैक्स का उपयोग कर रहा है और (यदि वह विफल रहता है) बाद में ओएक्सएक्स एक।
sdepold

1
मैंने sdepold की पोस्ट को एडिट किया है, यह अब फाइलनाम में व्हॉट्सएप को भी अनुमति दे सकता है।
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/… उम्मीद है कि यह मदद करता है
हरीस क्रजिना

2

फ़ाइलों के लिए लूप $ IFS शेल चर का उपयोग करता है। दी गई स्क्रिप्ट में, उन चरित्रों के साथ फिल्नाम जो कि $ IFS- चर में है, के लिए दो अलग-अलग फ़ाइलों के रूप में लूप में देखा जाएगा। यह स्क्रिप्ट इसे ठीक करती है: दिए गए सेडल-मैनुअल के रूप में मल्टीलाइन-मोड संशोधक मेरे ubuntu बॉक्स पर डिफ़ॉल्ट रूप से काम नहीं करता है, इसलिए मैंने एक अलग आवेदन की मांग की और इसे एक पुनरावृत्ति लेबल के साथ पाया, अनिवार्य रूप से यह केवल प्रतिस्थापन पर शुरू होगा अगर मैंने इसे सही तरीके से समझा है तो फाइल की अंतिम पंक्ति।

#!/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 --

[१] sed-subsition पैटर्न: मैं sed का उपयोग करके एक नई पंक्ति (\ n) को कैसे बदल सकता हूँ?


2

यह व्हाट्सएप को स्वचालित रूप से एक कमिट से पहले नहीं हटाता है , लेकिन यह प्रभावी रूप से आसान है। मैं एक फ़ाइल में निम्नलिखित पर्ल स्क्रिप्ट को git-wsf (git व्हाट्सएप फिक्स) के नाम से $ PATH में डाल सकता हूं ताकि मैं कर सकूं:

git wsf | श

और यह उन सभी व्हाट्सएप को हटाता है जो केवल फाइलों की लाइनों से होती हैं जो एक अंतर के रूप में रिपोर्ट करती हैं।

#! /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 में खोलें। व्हाट्सएप के साथ टैब को बदलने के लिए, vim कमांड लाइन में निम्नलिखित टाइप करें

:%s#\t#    #gc

अन्य अनुगामी व्हाट्सएप से छुटकारा पाने के लिए

:%s#\s##gc

यह मेरे लिए बहुत सुंदर था। यदि आपके पास संपादित करने के लिए बहुत सी फाइलें हैं तो यह थकाऊ है। लेकिन मुझे पूर्व-प्रतिबद्ध हुक और कई संपादकों के साथ काम करना आसान लगा।


यदि यह थकाऊ हो जाता है - और यदि आपके पास आपके द्वारा संपादित किए जाने वाले चीज़ों का बैकअप है - तो मैं अक्सर बस टैब को स्पेस में बदलने के लिए sed का उपयोग करता हूं: 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। सभी परियोजना सदस्यों के बीच सेटिंग को ठीक रखने के लिए अच्छा है।

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

3
afaik, अंदर .it सेटिंग्स किसी और के साथ साझा नहीं की जाती हैं ; वे आपके स्थानीय रेपो के लिए विशिष्ट हैं
एलेक्सचैफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.