2010-10-26 15 views
33

Mam repozytorium git, w którym zastąpiłem wiele plików lokalnie.jak cofnąć wszystkie zmiany białych znaków za pomocą git

Status git pokazuje teraz wiele zmodyfikowanych plików.

Niektóre są "naprawdę zmodyfikowane", inne różnią się jedynie końcami linii.

Chcę tych, które różnią się tylko końcami linii, aby odejść (git zresetować je), ale Nie mogę znaleźć linux-piping-foo, aby to się stało.

Punkty premiowe za usunięcie plików, których jedyną różnicą jest wykonywany bit.

+1

Szybka uwaga: na wszystkich takich plikach uruchomisz 'git checkout', a nie' git reset'. – Cascabel

+0

Należycie zauważyć, thnx! –

Odpowiedz

42

to zrobi:

git diff -b --numstat \ 
| egrep $'^0\t0\t' \ 
| cut -d$'\t' -f3- \ 
| xargs git checkout HEAD -- 
  1. Uruchom diff kopii roboczej w stosunku do indeksu i zwięzłe odczytu maszynowego dla każdego pliku, ignorując zmiany spacji.
  2. Znajdź pliki, które nie uległy zmianie zgodnie z diff -b.
  3. Weź ich nazwiska.
  4. Przekaż je do git checkout na czubku gałęzi.

Ta rura zrobi coś sensownego dla każdego kroku, który zakończysz, więc możesz zacząć od pierwszej linii i dodać więcej, aby zobaczyć, co dzieje się na każdym kroku.

A mogą użyteczna alternatywa ostatnia linia:

| git checkout-index --stdin 

byłoby to przywrócenie plików do ich inscenizowanych treści zamiast do ostatniego stanu zaangażowanej.

Możesz także użyć git diff HEAD w pierwszym wierszu, aby uzyskać różnicę kopii roboczej względem ostatniego zatwierdzenia zamiast indeksu.


Uwaga: jeśli masz nazwy plików ze spacjami w nich, będzie trzeba najpierw dodać tr:

git diff -b --numstat \ 
| egrep $'^0\t0\t' \ 
| cut -d$'\t' -f3- \ 
| tr '\n' '\0' \

Następnie należy dodać -0/-z przełącznik Niezależnie od ostatecznego rozkazu ty chciał użyć:

| xargs -0 git checkout HEAD -- 
# or 
| git checkout-index --stdin -z
+0

Dla nazw plików, które zawierały spacje, to kończy się niepowodzeniem z: error: pathspec "..." nie pasuje do żadnego pliku (ów) znanego z git. Dodałem 'sed' do potoku, aby zacytować nazwy plików: ' git diff -b --numstat | egrep $ '^ 0 \ t0 \ t' | cut -d $ '\ t' -f3- | sed -E 's /(.+)/ "\ ​​1"/"| xargs git checkout HEAD - ' – thenickdude

+0

@thenickdude: istnieje lepszy sposób używania terminatorów NUL zamiast cytowania. Zaktualizowałem swoją odpowiedź. –

2

Użytkownicy systemu Windows - nie rozpaczaj!

  1. Zainstaluj bash on ubuntu on windows.
  2. Otwórz bash na systemie Ubuntu w wierszu polecenia Windows.
  3. Zamontuj dysk zawierający repo. Aby uzyskać dostęp do dysku C, wykonaj cd /mnt/c.
  4. Zmień katalog na swoim repo: cd repos/my-project
  5. Wykonaj polecenie z Aristotle Pagaltzis's incredible answer:
git diff -b --numstat \ 
| egrep $'^0\t0\t' \ 
| cut -d$'\t' -f3- \ 
| xargs git checkout HEAD -- 
  1. upvote Aristotle Pagaltzis's answer.
Powiązane problemy