2010-11-06 5 views
34

Abbiamo una base di codice massiccia e antica che richiede molta pulizia. Abbiamo sempre avuto standard di codifica e tutti hanno sempre cercato di seguirli, ma non sono stati applicati, quindi nel tempo sono state violate molte violazioni. Molti di questi sono solo problemi di spazio bianco, come l'uso di tabulazioni anziché spazi o spazi in cui non dovrebbe essere nessuno, o spazi mancanti dove dovrebbero essere. Inizieremo attivamente ad applicare i nostri standard di codifica per assicurarci che non vi siano più violazioni, ma è difficile applicarli in modo automatico solo sulle modifiche, quindi sarebbe bello ripulire questi vecchi file.git: cambia stile (spazio) senza cambiare proprietà/colpa?

Ci sono strumenti che possono automatizzare la risoluzione di questi problemi, tuttavia se lo faccio, allora la colpa mi mostrerà come il proprietario di quelle linee, quando in realtà potrei non averle mai nemmeno viste. So che c'è un'impostazione per far sì che la colpa ignori i cambiamenti dello spazio bianco, ma non posso far sì che tutti facciano la colpa allo stesso modo, inclusi altri strumenti visivi e cose come gitstats. In un mondo ideale ci sarebbe un modo per riscrivere la storia per sembrare che le violazioni non siano mai state introdotte, senza nascondere chi ha introdotto il codice vero e proprio, ma non riesco a trovare nulla di simile.

+4

La cronologia di riscrittura è un po 'imbarazzante: una volta modificati i commit, gli altri dovranno prendere quei cambiamenti. Non fa parte di un flusso di lavoro ideale. Si potrebbe voler esaminare l'applicazione degli standard di codifica utilizzando gli hook.È possibile utilizzare un hook di aggiornamento per eseguire l'applicazione finale quando si preme su un repository centrale, e si può dare agli sviluppatori un hook pre-commit per fare la stessa validazione per loro, e anche riparare automaticamente le cose se è sicuro farlo. (Se vuoi correggere quello che c'è già, lo farei semplicemente in un singolo commit - non c'è bisogno di passare attraverso il mal di testa di riscrivere l'intera storia.) – Cascabel

+3

possibile duplicato di [Git commit che non sovrascrive gli autori originali in git blame] (http://stackoverflow.com/questions/3945382/git-commit-that-doesnt-override-original-authors-in-git-blame) –

+3

Non penso che sia esattamente un duplicato di quella domanda . Nella mia domanda ho affermato esplicitamente che cambiare le bandiere sulla colpa non è adeguato, e la risposta accettata a questa domanda è esattamente quella. –

risposta

17

In un mondo ideale non ci sarebbe un modo per riscrivere la storia a guardare come le violazioni non sono mai stati introdotti

git filter-branch fa proprio questo.

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

Questo ha gli stessi problemi di tutta la storia comandi riscrittura fanno, in quanto invalida sostanzialmente tutti i repository clonati.

+0

Grazie, esaminando questo ora! –

+6

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

+9

come è il tuo cleanup.php? – Cybot

35

Se si sta tentando di ottenere un problema di causa root usando la colpa, non dimenticare di utilizzare il flag -w per ignorare tutti gli spazi vuoti o le modifiche di indentazione. Quindi otterrai l'ultima modifica reale al codice, invece solo una rientranza o la rimozione degli spazi finali.

git blame -w app/to/file.rb 

oppure si può semplicemente utilizzare, comando git schiaffo ..

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

dover stessi risultati: D

+1

Da dove viene questo comando 'git slap'? –

+5

@ErikAllik Non sono sicuro di cosa intendi, ma una riga prima di 'git slap' è usata, è definita come un alias per' git blame -w'. – blinry

+0

Uno degli aspetti negativi dell'argomento degli spazi bianchi è che tiene conto del refactoring dell'ordine dei metodi, della rimozione di commenti non validi e di molte altre cose. – JosephMCasey

1

ho fatto una richiesta di pull al TextMate git Bundle, per impostare questa "w" parametro per impostazione predefinita per il comando "Sfoglia file annotato (colpa)". Grazie Mario Zaizar, hai reso la mia giornata.

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

Sulla Mario's answer, vorrei suggerire git shame come globale git-alias:

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

... e utilizzarlo al posto di git-colpa:

git shame path/to/file 

Per spiegare :
- -w Ignora gli spazi bianchi cambia, in modo da non incolpare qualcuno che rientri il codice
- -M Rileva le linee che sono state spostate o copiate e incolpa l'autore originale