2013-02-01 17 views
24

Attualmente sto cercando di eseguire il controllo in stile codice sui PR di un repository (github) e voglio consegnare le patch ai submitter con cui possono facilmente risolvere il codestyle. A tal fine, sto tirando giù il loro PR, eseguo il nostro script non crittografato su di esso per correggere eventuali errori di stile e voglio creare un file .patch che possano facilmente applicare. Tuttavia, si rompe costantemente su alcuni file.git-apply fallisce misteriosamente, come posso risolvere/risolvere?

I do (Git versione 1.7.10.4 con core.autocrlf=input, core.filemode=false):

$ git checkout pr-branch 
$ git log -1 (shows: commit dbb8d3f) 
$ git status (nothing to commit, working directory clean) 
$ <run the code styler script, which modifies some files> 
$ git diff > ../style.patch (so the patch file lands outside the repo) 
$ git reset --hard HEAD (to simulate the situation at the submitter's end) 
$ git log -1 (shows: commit dbb8d3f) 
$ git status (nothing to commit, working directory clean, so we are where we started) 
$ git apply ../style.patch 
error: patch failed: somefile.cpp:195 
error: somefile.cpp: patch does not apply (same output using the --check option) 

Questo vale solo per alcuni file, non tutti di loro. Non so come risolvere questo problema, ad esempio come ottenere git per dirmi esattamente dove va male - mi dice solo un hunk # quando scrivo, ma è ancora abbastanza grande.

Quello che ho provato finora (senza successo):

  1. apply --reverse, apply --whitespace=nowarn
  2. diff HEAD invece di solo diff
  3. fare un manichino commit (! Commettere opere senza problemi), utilizzare format-patch , eliminare il commit fittizio, applicare la patch con git-am con o senza -3 o applicare con git-apply
  4. Avere il file di correzione nello cal dir invece di uno fino (afferrare a cannucce, qui)
  5. Controllare le pagine man di git-diff, -Apply, -format-patch, -am per qualcosa di utile
  6. patch con il comando di Linux patch
  7. ....

Non so cosa potrebbe essere sbagliato con il diff. Le cose dello spazio bianco dovrebbero solo avvertire, giusto? In ogni caso, non voglio ignorarli, poiché si tratta di una correzione di stile che ovviamente coinvolge spazi bianchi.

Come posso risolvere/diagnosticare questo o persino scoprire dove si trova esattamente il punto di balle? Sarebbe d'aiuto se avessi postato il diff di uno dei file colpevoli? Ciò che mi confonde anche è che il comando funziona senza problemi, ma la patch creata dal commit non lo fa ??

Dopo aver lottato con questo per diverse ore Sono alla fine della mia conoscenza ...

+5

'git applicare - -reject' per vedere le modifiche respinte. – aragaer

+0

Provato già ... questo mostra solo l'intero pezzo che fallisce (circa 2-300 linee in quel caso), quindi non molto informativo – Christoph

+0

Un'altra ipotesi - potrebbero esserci alcuni nomi di file e qualcosa potrebbe essere diventato 'gitignored' come risultato. – aragaer

risposta

23

Aggiornamento:

È possibile utilizzare git apply -v per vedere Informazioni più dettagliate su quello che sta succedendo, git apply --check per verificare l'operazione o git apply --index per ricostruire il file di indice locale.

In base al tuo commento, sembra che il tuo indice locale sia stato danneggiato e quindi index risolto.

Lascerò la mia risposta originale ei commenti principalmente per dare alle persone un contesto su quello che stava succedendo, poiché sospetto che altre persone possano saltare alle stesse conclusioni iniziali che avevo basato sulla descrizione del problema.

------

Molto probabilmente non c'è niente di sbagliato con il diff.Invece guarda il repository git di destinazione. Mentre stai facendo git reset --hard HEAD, nulla ti garantisce che il HEAD su quell'altro repository sia lo stesso del HEAD sul tuo.

Do git log sul repository di destinazione e guardare il commit in alto. È lo stesso di quello da cui hai prodotto il diff? Molto probabilmente non lo è. Guarda la cronologia e controlla se il commit di cui hai bisogno è lì. Se lo è, il repository di destinazione è più avanti del tuo e devi tornare indietro, fare git pull (o git rebase) e produrre un nuovo diff. In caso contrario, il repository di destinazione è dietro il tuo, e devi fare git pull (o git rebase) sul repository di destinazione per portarlo alla velocità.

Ricorda che se hai altre persone che si impegnano al tuo repo "master" (quello da cui provengono i tuoi repository e i repository di destinazione), potresti dover fare il git pull repository, per ottenerli a un numero ragionevolmente recente impegno comune.

+0

Nella procedura che ho descritto sopra il TESTO corrente è lo stesso sia per la creazione di diff sia per l'applicazione di diff. È l'ultimo impegno in quel ramo. Faccio il reset esattamente per eliminare eventuali problemi da HEAD diversi. così non può essere. L'aggiornamento quando necessario è già gestito automaticamente, ma se la domanda non funziona nella situazione test precedente, fallirà anche lì, quindi deve essere risolto prima. – Christoph

+0

Non è chiaro dalla descrizione se entrambi gli "HEAD" puntano allo stesso commit. La mia ipotesi è che non lo siano, ma se li hai controllati e lo sono, allora effettivamente qualcosa non va con il diff. –

+0

Inoltre, prova 'git apply -v', o giocando con le opzioni' --check' e '-index'. –

3

Prova a controllare contro la vostra patch del file - ad esempio:

git apply --reject mypatch.patch 

Questo ti mostrerà le differenze eventuali - qui è un esempio di come potrebbe apparire come:

error: patch failed: <filename>:<linenumber> 
error: while searching for : 
    cout << "}" << endl; // example of a line in your patch 
+0

Sembra lì ma dà ancora questo errore –