Am editor de text pentru a ajusta automat la sfârșit spațiu la salvarea unui fișier, și eu contribui la un proiect open source, care are grave probleme cu trailing spațiu.
De fiecare dată am încerca să prezinte un patch mai întâi trebuie să ignore toate spațiile albe-doar modificări de mână, pentru a alege doar informațiile relevante. Nu numai asta, dar atunci când am rula git rebazare
am rula, de obicei, în mai multe probleme din cauza lor.
Ca atare, aș dori să fie în măsură să adăugați la index doar non-spațiu modificări, într-un mod similar ca git add-p
are, dar fără a fi nevoie pentru a alege toate modificările mine.
Stie cineva cum se face acest lucru?
EDIT: am nu se poate schimba modul în proiectul de lucrări, și au decis, după o discuție pe lista de corespondență, să ignore acest lucru.
@Frew soluție a fost't destul de ceea ce am nevoie, astfel încât acesta este alias-am făcut pentru exact aceeasi problema:
alias.addnw=!sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero -'
Sau puteți rula pur și simplu:
git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -
Adăugat opțiuni -U0 " și " --unidiff-zero
, respectiv pentru soluție context potrivire probleme, în conformitate cu acest comentariu.
Practic se aplică patch-uri care ar putea fi aplicate cu " add " fără spațiu modificări. Veți observa că după o git addnw ta/file
nu va fi în continuare nestaditizat schimbări, l's de spații goale în stânga.
... Nu-culoarea e't de necesare, dar ca am culori setat la întotdeauna, am să-l folosească. Oricum, mai bine în siguranță decât îmi pare rău.
Aceasta funcționează și pentru mine:
Dacă doriți să păstrați o rezervă în jurul valorii de, acest lucru funcționează
git stash && git stash apply && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch
Eu nu't ca ascunzători, dar nu ai într-un bug in git + cygwin unde am pierdut modificări, astfel încât să se asigure că lucrurile au mers la reflog cel puțin am stabilit următoarele:
git add . && git commit -am 'tmp' && git reset HEAD^ && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch
Practic vom crea un dif care nu't include modificările de spațiu, a reveni toate modificările, și apoi se aplică dif.
Creați un fișier patch conține numai schimbări reale (cu excepția liniilor cu doar spațiu modificări), apoi a curăța spațiul de lucru și de a aplica patch-uri fisier:
git diff > backup
git diff-w > modificări
git reset-hard
patch-uri < schimbări
Revizuire diferențele rămase, apoi " add " și comit
ca de obicei.
Echivalentul pentru Mercurial este de a face acest lucru:
hg dif > backup
hg diff-w > modificări
hg reveni ... tot
hg import ... nu-comite modificările
Adăugați următoarele la ta .gitconfig
:
anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"
Datorită @Colin Herbert's a răspunde pentru inspirație.
Sintaxa Explicație
Final #
trebuie să fie citat it's nu este tratată ca un comentariu în interiorul .gitconfig
, ci devine trecut și este tratat ca un comentariu în interiorul shell - este introdus între sfârșitul anilor git se aplică și furnizate de utilizator argumente care
gitplasează automat la sfârșitul liniei de comandă. Aceste argumente sunt't dorit aici - nu ne't vrei
git aplicade a le consuma, prin urmare precedent comentariu caracter. Poate doriți să rulați această comandă ca
GIT_TRACE=1 git anw` pentru a vedea acest lucru în acțiune.
La --
semnale end de argumente și vă permite pentru cazul în care aveți un fișier numit -w
sau ceva care ar arata ca un comutator pentru a git diff
.
A scăpat dublu-ghilimele $@
sunt necesare pentru a păstra orice furnizate de utilizator, citat de argumente. Dacă la "
personajul nu este scăpat, acesta va fi consumată de către .gitconfig
parser și să nu ajungă la shell.
Notă: .gitconfig
alias parsarea nu't recunoască single-citate ca pe ceva special - sale numai caractere speciale sunt "
, \
, \n
, și ;
(in afara de un "
-citat string). Acesta este motivul pentru o" trebuie să fi întotdeauna a scăpat, chiar dacă se pare că-l's în interiorul unui singur șir citat (care git este complet agnostici).
Acest lucru este important, de exemplu. dacă aveți la îndemână un alias pentru a executa o bash
comandă în arborele de lucru's rădăcină. Incorect de formulare este:
sh = !bash -c '"$@"' -
În timp ce cel corect este:
sh = !bash -c '\"$@\"' -
Top-votat răspunsul nu funcționează în toate cazurile, datorită spațiu în patch-uri contextul în funcție de utilizatori, în comentarii.
Am revizuit de comandă, după cum urmează:
$ git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero
Acest lucru generează un patch cu nici un context. Ar trebui't fi o problemă, deoarece patch-uri este de scurtă durată.
Corespunzătoare alias, din nou, o revizuire a ceea ce a fost deja furnizate de către alți utilizatori:
addw = !sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero' -
Am găsit un git de pre-comite cârlig care elimină trailing spațiu. Cu toate acestea, dacă puteți't obține alții de a utiliza acest lucru, atunci s-ar putea să nu fie o soluție validă.
#!/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
Tu ar trebui să ia în considerare mai întâi dacă la sfârșit spațiu este intenționată. Multe proiecte, inclusiv kernel-ul Linux, Opera, Drupal, și Kerberos (pentru a numi doar câteva din pagina de Wikipedia pe stil) interzice remorcarea spațiu. De la kernel-ul Linux, documentație:
Obține un editor decent și don't lași spațiile albe de la sfârșitul liniilor.
În cazul tău, problema este invers: anterior se angajează (și, poate, cele actuale) nu urmați acest ghid.
Am'd pariu că nimeni nu vrea cu adevărat la final spațiu, și de stabilire a problemei ar putea fi o schimbare binevenită. Alți utilizatori ar putea fi, de asemenea, se confruntă cu aceeași problemă ca și tine sunt. L's, de asemenea, probabil că contribuabil(s) care sunt adăugarea la sfârșit spațiu nu sunt conștienți că fac acest lucru.
Mai degrabă decât încercarea de a reconfigura git de a ignora problema, sau dezactivarea altfel de dorit funcționalitate în editor, am'd începe cu un post a proiectului lista de corespondență care să explice problema. Mulți editori (și git în sine) poate fi configurat să se ocupe cu trailing spațiu.