Git yapmadan önce sondaki boşlukları otomatik olarak kaldır


220

Git ekibim ile kullanıyorum ve benim farkları, günlükleri, birleştirme, vb. Boşluk boşluklarını kaldırmak istiyorum. Bunu yapmak için en kolay yolu git boşluk (ve diğer boşluk hataları otomatik olarak kaldırmak için git için olduğunu varsayalım ) uygulanır.

~/.gitconfigDosyaya aşağıdakileri eklemeyi denedim ama taahhüt ettiğimde hiçbir şey yapmıyor. Belki de farklı bir şey için tasarlanmıştır. Çözüm nedir?

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

Herkesin yakut özel fikirleri olması durumunda yakut kullanıyorum. Taahhüt etmeden önce otomatik kod biçimlendirme bir sonraki adım olacaktır, ancak bu zor bir sorundur ve gerçekten büyük bir soruna neden olmaz.


Core.whitespace yönergesi sorunlarınızı çözmezse, bunları sizin için bulmak ve düzeltmek için ön işleme kancalarını da (.git / kancalar / ön işleme) değiştirebilirsiniz. Ayrıntılı açıklama için bu gönderiye bakın .
VolkA

2
Benzer boşluk hataları ve kısmi çözümlerle hayal kırıklığına uğradım ve bedevil sürüm kontrol sistemlerindeki boşluk hatalarını düzelten veya basitçe raporlayabilen esnek ve oldukça özellikli bir yardımcı program yazdım : Github'daki Whitespace Total Fixer (bu çok kendi kendini tanıtıyorsa özür dilerim)
Dan Lenski

Yanıtlar:


111

Bu ayarlar ( core.whitespaceve apply.whitespace) sondaki boşlukları kaldırmak için orada değildir, ancak:

  • core.whitespace: algılama ve hataları yükseltme
  • apply.whitespace: ve şerit, ama sadece yama sırasında, "her zaman otomatik olarak" değil

Bunun git hook pre-commitiçin daha iyi bir iş yapacağına inanıyorum (sondaki boşluğun kaldırılmasını da içerir)


Herhangi bir zamanda pre-commitkancayı çalıştırmamayı seçebileceğinizi unutmayın :

  • geçici: git commit --no-verify .
  • kalıcı: cd .git/hooks/ ; chmod -x pre-commit

Uyarı: varsayılan bir tarafından pre-commit(gibi komut dosyası bu bir ), olan olmayan bir özellik "sondaki kaldırmak"", ancak 'uyarı' özelliği gibi:

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

Bununla birlikte , özellikle bunu düşündüğünüzde daha iyi bir pre-commitkanca oluşturabilirsiniz:

Git'te yalnızca hazırlama alanına eklenen bazı değişikliklerle uğraşmak, yine de asla çalışan bir kopya olarak var olamayacak ve çalışmayabilecek bir “atom” revizyonu ile sonuçlanır .


Örneğin, yaşlı adam başka bir cevapta boşlukları algılayan ve kaldıran bir pre-commitkanca önerir .
Bu kanca her dosyanın dosya adını aldığından, belirli dosya türleri için dikkatli olmanızı öneririm: .md(markdown) dosyalarındaki sondaki boşluğu kaldırmak istemezsiniz !


1
Git, apply.whitespaceçalışma kopya değişikliklerinizi bir yama olarak ele almak için kandırarak, çalışma kopyanızdaki beyaz alanı düzeltmeye ikna edilebilir . Bkz aşağıda Cevabımı .
ntc2

> ".md (markdown) dosyalarındaki sondaki boşlukları kaldırmak istemezsiniz" - Neden bu? Markdown dosyalarında boşluk bırakmanın amacı nedir? Bazı .editorconfigdosyaların bunun için belirli bir kuralı olduğunu fark ettim .
friederbluemle

5
@friederbluemle, işaretleme türüne bağlı olarak, sondaki bir çift boşluk şunu gösterir <br>: github.com/FriendsOfPHP/PHP-CS-Fixer/issues/…
VonC

Ayar core.whitespaceiçin trailing-spacebirlikte git configde işlemekle zaman hata yükseltmek değil git2.5.0.
Karl Richter

43

Git'i değişikliklerinizi bir yama olarak ele almak için Git'i kandırıp boşlukları sizin için düzeltmesini sağlayabilirsiniz. "Taahhüt öncesi kanca" çözümlerinin aksine, bu çözümler Git'e boşluk sabitleme komutları ekler.

Evet, bunlar hack'lerdir.


Sağlam çözümler

Aşağıdaki Git diğer adları my~/.gitconfig .

"Sağlam" ile, bu takma adların ağaç veya dizin kirli olup olmadığına bakılmaksızın, doğru olanı yaparak hatasız çalıştıklarını kastediyorum. Ancak, etkileşimli bir git rebase -iişlem devam ediyorsa çalışmazlar ; bkz gözlerimi~/.gitconfig Eğer bu köşe durumda, umurumda eğer ek kontroller için git add -esonunda açıklanan trick çalışmalıdır.

Onları bir Git takma adı oluşturmadan doğrudan kabukta çalıştırmak istiyorsanız, her şeyi kopyalayıp çift tırnak arasına yapıştırın (kabuğunuzun Bash gibi olduğunu varsayarak).

Dizini düzelt ama ağacı düzelt

Aşağıdaki fixwsGit diğer adı, dizindeki tüm boşluk hatalarını düzeltir, ancak ağaca değmez:

# 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"

Fikir dizinde boşluk hataları varsa daha git fixwsönce çalıştırmaktır git commit.

Dizini ve ağacı düzeltme

Aşağıdaki fixws-global-tree-and-indexGit diğer adı, varsa dizindeki ve ağaçtaki tüm boşluk alanlarını düzeltir:

# 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"

Ayrıca sürüm dosyalarındaki boşlukları düzeltmek için

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

Basit ama sağlam olmayan çözümler

Bu sürümlerin kopyalanması ve yapıştırılması daha kolaydır, ancak yan koşulları karşılanmazsa doğru şeyi yapmazlar.

Geçerli dizine köklenen alt ağacı düzeltin (ancak boş değilse dizini sıfırlar)

Kullanılması git add -e"düzenle" kimlik editörü ile yamalar için ::

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

Dizini düzeltin ve koruyun (ancak ağaç kirli veya dizin boşsa başarısız olur)

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

Ağacı ve dizini düzeltin (ancak boş değilse dizini sıfırlar)

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 .Hile açıklaması

Bu cevaptangit rebase --whitespace=fix hile öğrenmeden önce her yerde daha karmaşık hileler kullanıyordum .git add

Manuel olarak yapsaydık:

  1. Set apply.whitespaceiçin fix(sadece bir kez bunu yapmak zorunda):

    git config apply.whitespace fix
    

    Bu Git'e boşlukları düzeltme eklerini düzeltmesini söyler .

  2. Git'i değişikliklerinize yama olarak davranmaya ikna edin :

    git add -up .
    

    Her dosya için tüm değişiklikleri seçmek için a+ enterdüğmesine basın . Git boşluklarınızı düzeltmek için bir uyarı alırsınız.
    ( git -c color.ui=auto diffbu noktada dizine eklenmemiş değişikliklerinizin tam olarak boşluk hataları olduğunu gösterir).

  3. Boşluk hatalarını çalışma kopyanızdan kaldırın:

    git checkout .
    
  4. Değişikliklerinizi geri getirin (taahhütte bulunmaya hazır değilseniz):

    git reset
    

GIT_EDITOR=:Aracılığıyla kullanımı :düzenleyicisi olarak, ve bir komut olarak :kimliktir.


1
Sadece Windows'da test ettim: Bu bir DOS komut isteminde gayet iyi çalışıyor: set VISUAL= && git add -ue . && git checkout .Not : ' .' ile kullanılan git add: çünkü git1.8.3
VonC

@VonC Bu yanlış VISUAL'i kalıcı olarak ayarlamaz, bu da örneğin git commityanlış düzenleyiciyi kullanmak için daha sonra kullanılmasına neden olabilir mi? Bunu VISUAL=önlemek için yukarıdaki unix sürümünde bir alt kabuk parçası sarmak , ancak DOS alt kabukları olup olmadığını bilmiyorum.
ntc2

1
Büyük kesmek için teşekkürler! FYI, core.editorayarladıysanız VISUAL, yapılandırma ayarının öncelikli olması nedeniyle dışa aktarmanın bir etkisi olmaz man git-var. Bunu geçersiz kılmak için GIT_EDITOR=:bunun yerine dışa aktarmanız gerekir .
Nick

1
Ayrıca, fixwszaten interaktif bir rebase iseniz hızlı başarısız olmak için benim sürüm tweaked aksi takdirde git rebase --whitespace=fixçizgide ölecek ve garip bir durumda bırakacaktır. Bu sorudan ödünç aldım ve daha önce ek bir dava ekledim: 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 \ ...
Nick


29

Sondaki boşlukları kaldıran bir git ön işleme kancası buldum .

#!/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
İkinci sedçağırma ( sed -r 's/:[0-9]+:.*//') ile ikame edilebilir cut -f1 -d:. Bu hem Linux hem de BSD tabanlı platformlarda aynı şekilde çalışmalıdır.
Ihor Kaharlichenko

2
@IhorKaharlichenko: aslında, kullanmak cutikinci kadar güvenli değil sed: ":" içeren dosya adlarının (son derece düşük) dosyasında kesme başarısız olur. awk 'NF>2{NF-=2}1'Güvende olmak için kullanabilirsiniz
MestreLion

1
BTW, Windows kullanıyorsanız (msysgit) ve kullanıyorsanız core.autocrlf=true, sed'den dos2unix -D "$FILE"sonra for döngüsünün içine eklemek isteyebilirsiniz . Aksi takdirde, sadece sed yayınlayarak tüm CRLF'leri LF'lere değiştirir.
jakub.g

49
Doing git addbir taahhüt kanca iç bana oldukça kötülüğü görünüyor. Bir dosyayı kısmi olarak hazırlama / işleme koyuyorsanız ne olur? Tüm dosyanın arkanızda işlenmesini istemezsiniz, değil mi?
Stefaan

19

Mac OS'de (veya muhtemelen herhangi bir BSD'de) sed komut parametrelerinin biraz farklı olması gerekir. Bunu dene:

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

Bu dosyayı - olarak kaydedin .git/hooks/pre-commitveya zaten orada olanı arayın ve alt parçayı içinde bir yere yapıştırın. Ve unutmayın chmod a+x.

Veya global kullanım için ( Git taahhüt kancaları - global ayarlar aracılığıyla ) $GIT_PREFIX/git-core/templates/hooks(GIT_PREFIX'in / usr veya / usr / local veya / usr / share veya / opt / local / share olduğu) git inityerleştirebilir ve mevcut depolarınızın içinde çalışabilirsiniz .

Göre git help init:

Git init'i mevcut bir depoda çalıştırmak güvenlidir. Zaten orada olan şeylerin üzerine yazmaz. Git init'i yeniden çalıştırmanın başlıca nedeni yeni eklenen şablonları almaktır.


7
Bu kanca, çalışma dosyasını değiştirmiyor ve değiştirilmiş çalışma dosyasıyla dizinin üzerine yazmıyor mu? Eğer indeksinizi oluşturmak için 'git add -p' yazacak olsaydınız, bu işlem kanca bunu uçuracaktı.
Matthew Dutton

2
Evet, muhtemelen haklısın. Birinin bu komut dosyasını yeniden kullanmak git hash-object -wve git update-indexmunged dosyasını doğrudan dizine eklemek zorunda kalması gerekebilir. Çok cesur biri.
AlexChaffee

11

Bu görevi favori düzenleyicinize bırakmayı tercih ederim.

Kaydetirken arka boşlukları kaldırmak için bir komut ayarlamanız yeterlidir.


2
Vim ile bunu yapabilirsiniz: autocmd BufWritePre .cpp, .c, *. H:% / \ s \ + $ // e
Robert Massaioli

3
Üzgünüz, test etmeden önce yukarıdaki yorumu iptal ettim. Yüzde işaretinden sonra eksik "s" vardır ve boşluk bulunursa imleci hareket ettirir ve son arama desenini kaldırır. Daha iyi alternatifler için vim.wikia.com/wiki/Remove_unwanted_spaces adresine bakın .
Seth Johnson

1
Emacs Mx delete-trailing-whitespace.
Mauvis Ledford

2
Daha da iyisi, emacs (add-hook 'before-save-hook 'delete-trailing-whitespace)için, .emacsdosyanıza ekleyerek kaydetmeden önce sondaki boşluğu silmek için bir kanca ayarlayın . Emacs boşluk hileleri
Duncan Parkes

1
Sekmeleri boşluklara dönüştüren (add-hook 'before-save-hook' beyaz boşluk temizleme) kullanıyorum.
Nils Fagerburg

10

Git config ve git setup ile filtre kurulumunu kullanma

Tamam, bu bu sorunu çözmek için yeni bir yol… Yaklaşımım kanca kullanmak değil, filtreleri ve git niteliklerini kullanmak. Bunun yapmanıza izin verdiği şey, geliştirdiğiniz her makinede, dosyaları bitirmeden önce dosyaların sonunda fazladan boşluk ve ekstra boş çizgiler çıkaracak bir filtre seti kurmaktır. Ardından, filtrenin hangi tür dosyalara uygulanması gerektiğini söyleyen bir .gitattributes dosyası oluşturun. Filtrelerin cleandizine dosya eklenirken smudgeuygulanan ve çalışma dizinine eklenirken uygulanan iki aşaması vardır .

Git'e global bir nitelikler dosyası aramasını söyle

İlk olarak, global yapılandırmanıza bir global nitelikler dosyası kullanmasını söyleyin:

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

Global filtreler oluşturun

Şimdi filtreyi oluşturun:

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 komut dosyası sihrini ekle

Son olarak, fixup-eol-eofkomut dosyasını yolunuzda bir yere koyun ve çalıştırılabilir yapın. Komut dosyası, anında düzenleme yapmak için sed kullanır (satırların sonundaki boşlukları ve boşlukları ve dosyanın sonundaki boş satırları kaldırın)

fixup-eol-eof şöyle görünmelidir:

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

bu benim özüm

Git'e yeni oluşturulan filtrenizi hangi dosya türlerine uygulayacağınızı söyleyin

Son olarak, favori düzenleyicinizde ~ / .gitattributes_global oluşturun veya açın ve aşağıdaki gibi satırlar ekleyin:

pattern attr1 [attr2 [attr3 […]]]

Boşluk sorununu düzeltmek istiyorsak, tüm c kaynak dosyalarımız için şöyle görünen bir satır ekleriz:

*.c filter=fix-eol-eof

Filtrenin tartışılması

Filtrenin iki aşaması vardır: dizine bir şeyler eklendiğinde veya teslim edildiğinde uygulanan temiz faz ve git bir şeyleri çalışma dizininize koyduğunda bulaşma aşaması. Burada, lekelenmemiz içeriği catdeğiştirmeden bırakması gereken komut aracılığıyla , dosyanın sonunda bir satır sonu karakteri içermesi dışında , sadece içeriği çalıştırıyor . Temiz komut, http://sed.sourceforge.net/sed1line.txt adresindeki notlardan bir araya topladığım boşluk filtreleme . Bir kabuk betiğine konulması gerektiği gibi görünüyor, sed komutunun nasıl enjekte edileceğini anlayamadım, dosyanın sonunda ekstra ekstra satırların doğrudan git-config dosyasına sanitasyonu da dahil. (Bunu CANAncak boşluklardan kurtulun, ancak ayrı bir sed komut dosyasına ihtiyaç duymadan, sekmeye basarak gerçek sekmenin olduğu filter.fix-eol-eofgibi bir şeye ayarlayın .)sed 's/[ \t]*$//' %f\t

Requir = true, bir şeyler ters giderse sizi beladan uzak tutmak için bir hatanın ortaya çıkmasına neden olur.

Git ile ilgili benim dilim kesin değilse lütfen beni affet. Sanırım kavramları oldukça iyi anlıyorum ama hala terminolojiyi öğreniyorum.


İlginç bir yaklaşım. +1
VonC

Teşekkürler @VonC! Ben de bu özelliği git özniteliklerinin .gitklasör yerine global olarak değil tekrarlayıcı bir şekilde yapılandırılabileceğine işaret etmek istiyorum , bu daha mantıklı olabilir.
zbeekman

9

Önceki öneri, hedef dosyalarda çok fazla boşluk bırakıyorsa önceki öneriler okunamayan komutlar oluşturma eğiliminde olduğundan, yalnızca arkadaki boşluğu değiştirdiğiniz / eklediğiniz satırlardan kaldıran bu ön işleme kancasını yazdım.

#!/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
İlginç. +1. Boş ağacı hesaplamak için diğer cevabımı gör .
VonC

1
İyi fikir, tam da bunu istiyorum. Ancak, bunu kullanırken dikkatli olun! OSX ve git sürüm 2.3.5 benim için o sahneye herhangi bir ekleme ama taahhüt edilmemiş değişiklikler esiyor. Yine de bunun için çalışan bir çözümle ilgileniyorum.
Casper

9

Deneyin benim pre-taahhüt kancaları , otomatik sondaki-boşluk algılayabilir ve kaldırmak . Teşekkür ederim!

altında çalışabilir GitBash(windows), Mac OS X and Linux!


Enstantane fotoğraf:

$ 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
İlginç. +1. Kendi
cevabımda

@VonC Beyanınız için teşekkürler! '.Md', sadece buldum git commit -no-verify, herhangi bir iddia?
yaşlı adam

Ben kanca .mdson kullanıcı --no-verifyüzerinde bir seçenek eklemek isteyen yerine, dosyayı tespit ve boşlukları kaldırmak mümkün değil yapmak istiyorum git commit.
VonC

+Veya ile başlayan bir dosya / dizin -
işlenirse

6

İşte bir ubuntu + mac os x uyumlu sürüm:

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

İyi eğlenceler


Sizinki ve benimki arasındaki tek fark, sed'in dosyayı yeniden yazmadan önce bir şeyin yerini alacağını kontrol etmenizdir ... Git, hiçbir şeyi değiştirmeyen değişiklikler yapmadığından emin değilim. Sanırım marjinal olarak daha güvenli, ama aynı zamanda daha yavaş ve regex'leri bir satırda iki kez tekrarlamamanın netliğini tercih ediyorum. De gustibus non disputandum est!
AlexChaffee

fark, sürümün önce ubuntu sözdizimini kullanması ve daha sonra osx olanının (başarısız olması durumunda) kullanmasıdır.
sdepold

1
i sdepold'un gönderisini düzenledim, şimdi dosya adlarındaki boşluklara da izin verebilmelidir.
imme

5

Bugün bunu düşünüyordum. Bir java projesi için yaptığım tek şey bu:

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

3

İçin Sublime Metin kullanıcıları.

Ayar-Kullanıcı yapılandırmasında aşağıdakileri doğru şekilde ayarlayın .

"trim_trailing_white_space_on_save": true


1
Bunu dosya türüne göre ayarlamanın bir yolu var mı? Ben *.mdbir basit işaretleme için (çift sonunda boşluk) güvenmek (markdown) dosyalarını "" <br />ve bu ayar için geçerli görünmektedir tüm ı olanlar dahil dosyalar, yok sondaki boşlukları kaldırmak istiyorum.
VonC

@VonC Burada yapılandırmanın nasıl uygulandığı konusunda hiyerarşi var, stackoverflow.com/questions/16983328/… yardımcı olacağını umuyoruz
Haris Krajina

2

for-loop for files $ IFS kabuk değişkenini kullanır. verilen komut dosyasında, içinde $ IFS değişkeninde de bulunan bir karaktere sahip dosya adları for-loop'ta iki farklı dosya olarak görülür. Bu komut dosyası düzeltir: sed-manual verildiği gibi çok satırlı mod değiştirici benim ubuntu kutumda varsayılan olarak çalışmıyor gibi görünüyor, bu yüzden farklı bir uygulama için aradım ve bunu yineleyen bir etiketle buldum, aslında sadece doğru anladıysam dosyanın son satırı.

#!/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] sed-subsition pattern: sed kullanarak bir satırsonu (\ n) nasıl değiştirebilirim? .


2

Bu, bir taahhütten önce boşlukları otomatik olarak kaldırmaz , ancak uygulanması oldukça kolaydır. Ben $ perh bir dir git-wsf (git whitespace fix) adlı bir dosyaya aşağıdaki perl betiği koymak böylece:

git wsf | sh

ve tüm boşlukları yalnızca git raporlarının fark olarak bulunduğu dosya satırlarından kaldırır .

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

Biraz geç ama dışarıda birine yardım edebileceğinden, işte gidiyor.

Dosyayı VIM'de açın. Sekmeleri boşluklarla değiştirmek için vim komut satırına aşağıdakileri yazın

:%s#\t#    #gc

Diğer izleyen boşluklardan kurtulmak için

:%s#\s##gc

Bunu benim için yaptım. Düzenlenecek çok fazla dosyanız varsa sıkıcı. Ama ön işlem kancalarından ve birden fazla editörle çalışmaktan daha kolay buldum.


Sıkıcı hale gelirse ve düzenlemek üzere olduğunuz şeyin bir yedeğine sahipseniz, sekmeleri boşluklara değiştirmek için genellikle sed'i kullanırım: sed -i 's|\t| |g' filenames(değiştirme konumundaki boşluklar). Dosya adlarınızı almak için find komutunu kullanabileceğinizi unutmayın. Bu yedeklemeyi nasıl alacağınızı düşünmediyseniz, genellikle her şeyi taahhüt ederim ve sonra da bulunduğum yere yumuşak bir sıfırlama ile taahhüdü 'geri alırım'; bazen her şeyi ağaca ekliyorum ama taahhüt etmiyorum ve bazen de saklamak / uygulamak (pop değil!) kullanıyorum. Endişeli hissedersem, tüm ağacımı güvenli bir yere götürmeden önce rsync ...
adaçayı

0

Dosyadaki satır sonundaki boşluktan sonra silmek için şunu kullanın ed:

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

-1

Bu muhtemelen sorununuzu doğrudan çözmez, ancak bunları gerçek proje alanınızda git / config ile ayarlamak isteyebilirsiniz. Ayarları tüm proje üyeleri arasında tutarlı tutmak güzel.

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

3
afaik, .git içindeki ayarları vardır değil başka kimseyle paylaşılmaz; yerel
deponuza özgüdürler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.