2010-11-06 13 views
34

Mamy ogromny, starodawny kod, który wymaga wielu porządków. Zawsze mieliśmy standardy kodowania i każdy zawsze starał się ich przestrzegać, ale nie były one egzekwowane, więc z czasem doszło do wielu naruszeń. Wiele z nich jest po prostu problemami z białymi znakami, takimi jak używanie zakładek zamiast spacji lub miejsc, w których nie powinno być żadnych lub brakujących miejsc, w których powinny być. Zaczniemy aktywnie egzekwować nasze standardy kodowania, aby upewnić się, że więcej naruszeń nie wkradło się, ale trudno jest wymusić je w sposób automatyczny tylko na zmianach, więc byłoby dobrze wyczyścić te stare pliki.git: zmienić styl (białe znaki) bez zmiany właściciela/winy?

Są narzędzia, które mogą zautomatyzować naprawianie tych problemów, jednak jeśli to zrobię, wtedy wina będzie pokazywać mnie jako właściciela tych linii, podczas gdy w rzeczywistości może nigdy nie widziałem ich. Wiem, że istnieje ustawienie powodujące, że wina ignoruje zmiany w białych znakach, ale nie mogę zmusić wszystkich do obwiniania w taki sam sposób, w tym innych narzędzi wizualnych i takich, jak gitstats. W idealnym świecie byłby jakiś sposób na przepisanie historii, aby wyglądało na to, że naruszenia nigdy nie zostały wprowadzone, bez ukrywania, kto wprowadził rzeczywisty kod, ale nie mogę znaleźć czegoś takiego.

+4

Przepisywanie historii jest nieco niezręczne - po zmianie zatwierdzeń, inne będą musiały wykryć te zmiany. Nie stanowi części idealnego przepływu pracy. Możesz zajrzeć do egzekwowania standardów kodowania za pomocą haków.Możesz użyć haka aktualizacji, aby wykonać ostateczną egzekucję po przejściu do centralnego repozytorium, i możesz dać programistom pre-commit hook, aby zrobić to samo sprawdzanie poprawności dla nich, a nawet automatycznie naprawić rzeczy, jeśli jest to bezpieczne. (Jeśli chcesz naprawić to, co już tam jest, po prostu zrobiłbym to w jednym zatwierdzeniu - nie trzeba przechodzić przez ból głowy przepisywania całej historii.) – Cascabel

+3

możliwy duplikat [Git commit, który nie zastępuje oryginalnych autorów w git winić] (http://stackoverflow.com/questions/3945382/git-commit-that-doesnt-override-original-authors-in-git-blame) –

+3

Nie sądzę, że jest to dokładnie duplikat tego pytania . W moim pytaniu wyraźnie stwierdziłem, że zmiana flag na winy nie jest właściwa, a przyjęta odpowiedź na to pytanie jest właśnie taka. –

Odpowiedz

17

W idealnym świecie nie byłoby jakiś sposób, aby przepisać historię wyglądać naruszenia nie zostały wprowadzone

git filter-branch robi dokładnie to.

http://git-scm.com/docs/git-filter-branch

ten ma takie same problemy jak całej historii poleceń przepisywanie zrobić, ponieważ zasadniczo unieważnia wszystkie sklonowane repozytoriami.

+0

Dzięki, patrząc na to teraz! –

+6

Gotowy! 'git filter-branch --tree-filter 'git diff-drzewo -name-only --diff-filter = AM -r --no-commit-id $ GIT_COMMIT | php cleanup.php 'HEAD' –

+9

Jak wygląda Twój cleanup.php? – Cybot

35

Jeśli próbujesz uzyskać przyczynę powodującą root za pomocą winy, nie zapomnij użyć flagi -w, aby zignorować wszystkie białe spacje lub zmiany wcięć. Więc dostaniesz ostatnią prawdziwą zmianę w kodzie, zamiast tylko wcięcie lub usunięcie końcowych spacji.

git blame -w app/to/file.rb 

lub można po prostu użyć, komenda git policzek ..

git config alias.slap "blame -w"; 
git slap app/path/to/file.rb 

mający takie same wyniki: D

+1

Skąd pochodzi polecenie 'git slap'? –

+5

@ErikAllik Nie jestem pewien co masz na myśli, ale jedna linijka przed użyciem 'git slap' jest zdefiniowana jako alias dla' git blame -w'. – blinry

+0

Jednym z minusów argumentu -w whitespace jest to, że uwzględnia on refaktoryzację kolejności metod, usuwanie luźnych komentarzy i wiele innych rzeczy. – JosephMCasey

1

Zrobiłem żądania ściągania do TextMate git Bundle, aby ustawić ten "-w" domyślnie dla polecenia "Przeglądaj plik z adnotacjami (winy)". Dzięki Mario Zaizar, zrobiłeś mój dzień.

diff --git a/Support/lib/git.rb b/Support/lib/git.rb 
index 5e8de13..5192953 100644 
--- a/Support/lib/git.rb 
+++ b/Support/lib/git.rb 
@@ -307,6 +307,9 @@ module SCM 
     file = make_local_path(file_path) 
     args = [file] 
     args << revision unless revision.nil? || revision.empty? 
+  # Ignore whitespace when comparing the parent's version and 
+  # the child's to find where the lines came from. 
+  args << '-w' 
     output = command("annotate", *args) 
     if output.match(/^fatal:/) 
     puts output 
2

Opierając się na Mario's answer, chciałbym zaproponować git shame jako globalnego git-Alias:

git config --global alias.shame 'blame -w -M' 

... i używać go zamiast git-winy:

git shame path/to/file 

Aby wyjaśnić :
- -w Ignoruje zmiany białych znaków, więc nie obwiniaj kogoś, kto ponownie naciął kod
- -M Wykrywa linie, które zostały przeniesione lub skopiowane, i obwinia autora oryginalnego.

Powiązane problemy