2014-12-15 15 views
17

Styl mojego projektu oznacza przycinanie spacji, ale to sprawia, że ​​różnice są bardzo, bardzo niechlujne. Chciałbym je skonsolidować z jednym zatwierdzeniem, zanim zatwierdzę faktyczną poprawkę.git-add only whitespace changes?

ta jest ściśle związana z Add only non-whitespace changes, ale prosi dokładnie odwrotnie:

Czy istnieje sposób, aby dodawać tylko białe znaki zmian w obszarze staging?

Odpowiedz

23

Można spróbować następujący „trick”:

git add -A 
git diff --cached -w | git apply --cached -R 

To w zasadzie wszystko dodaje do indeksu, a następnie unstages wszystkie zmiany, które wpływają na więcej niż spacji.

+1

Powiązane, do tworzenia alias git: http://stackoverflow.com/a/19525426/1443496. Wygląda na to, że nie ma sprytnej sztuczki, która pozwalałaby na wyprowadzanie potoków w aliasie, więc musisz odłożyć do powłoki. –

+0

@SeanAllred thanks Błędnie odczytałem pytanie –

+0

Ma to nieco dziwne zachowanie, gdy przed normalizacją pliku są dwie nowe linie na końcu (gdzie normalizacja powoduje przycięcie do jednego). –

2

o to rozwiązanie bash, który pracował dla mnie

for fname in $(git diff --name-only --diff-filter=ACMR --full-index HEAD) 
do 
    diff=$(git diff -w --ignore-blank-lines --exit-code $fname) 
    if [ $? -eq 0 ]; then 
     echo "only whitespace diff on $fname ! adding to git..." 
     git add $fname 
    else 
     echo "diff on $fname!" 
    fi 
done 
+0

Witamy w SO! :) –

1

musiałem łączyć i modyfikować Tobiasza i odpowiedź nneonneo do popełnienia spacje wielu plików z dużymi dyferencjału. Upewnij się, że uruchamiasz to z katalogu głównego repozytorium.

git add -A 
for FILE_NAME in $(git --no-pager diff --name-only --diff-filter=ACMR --full-index HEAD) 
do 
    git --no-pager diff --cached -w $FILE_NAME | git apply --cached -R 
done 

git --no-pager zapobiega domyślne przewijania że GIT wykorzystuje się do wyświetlania dużych ilości danych. Pętla --name-only pozwala poleceniu pracować na wielu plikach.