Il codice temporaneo deve essere messo sotto controllo di versione e come?

29

Ecco alcuni esempi di codice temporaneo / locale. È necessario per lavorare con il codebase, ma sarebbe dannoso farne parte:

  1. File di progetto. Potrebbe essere necessario modificare i percorsi per riflettere il layout sul PC corrente.
  2. Makefiles. Ad esempio, potrebbe essere necessario disattivare l'ottimizzazione durante il debug, ma non per il server CI.
  3. Hack brutti sporchi. Ad esempio return 7 nel mezzo di una funzione, per testare qualcosa, a seconda della funzione, e si sospetta che si interrompa al valore di 7. Oppure 7 è il codice del pulsante non ancora implementato, che sto implementando e che ho bisogno per testare tutta la vita del mio ramo.

Ho provato a mantenere quelli in un git commit che ho sempre rebase in cima prima di premere sul repository e poi spingere HEAD~ . Questo è abbastanza scomodo e non funziona con svn. Stashing mi spaventa ancora di più - "mi sono ricordato di schioccare dopo aver spinto ??".

Mantenere il codice fuori dal controllo di versione introduce un rumore sgradevole ogni volta che viene assemblato un commit e potrebbe essere inserito accidentalmente in un commit qualche venerdì sera.

Quale sarebbe una soluzione equilibrata per tale codice throw-away?

    
posta Vorac 24.07.2014 - 17:05
fonte

10 risposte

46

Tutto il codice è temporaneo. Quando apporto i cambiamenti, occasionalmente inserisco dei segnaposto - quell'icona che ho atteso per il vero dal designer, la funzione che conosco chiamerà la libreria che il mio collega sta scrivendo e che non ha ancora terminato (o avviato), la registrazione aggiuntiva che verrà rimossa o comunque resa condizionale, i bug che riuscirò a risolvere una volta che saranno stati notati dal team di test, ecc.

Quindi controlla tutto. Usa un ramo di funzionalità per tutto il tuo sviluppo, quindi puoi unire la versione finale nel trunk e nessuno dovrà sapere quali hack e corposi e le correzioni apportate durante il tuo ciclo di sviluppo, saranno solo bisogno di vedere la versione finale. Ma se ti sei impegnato regolarmente nella tua filiale, sarai in grado di vedere le cose che valeva la pena di tenere se un giorno fosse andato in modo spettacolare sbagliato, o continuassi a programmare dopo una pausa pranzo al pub.

Il controllo della versione non è un repository di risorse o un sistema di archiviazione di documenti. Riguarda la storia dei cambiamenti. Attacca tutto ciò che ti piace, perché un giorno potresti voler vedere di cosa si tratta, e quelli sono i giorni in cui capisci di cosa tratta veramente il tuo SCM.

PS. I file veramente temporanei (ad esempio .obj o build artefacts) non hanno posto nel tuo SCM. Queste sono cose che non hanno valore per nessuno. Puoi dire cosa sono - se li elimini non ti dispiace, o addirittura noti che se ne sono andati.

    
risposta data 24.07.2014 - 17:45
fonte
17

Project files. Paths may need to be edited in order to reflect the layout on the current PC.

Per i file di progetto, la strategia migliore è quando puoi generare il file di progetto tramite uno script. Aggiungi il vero file di progetto alle tue ignorazioni e semplicemente ri-genera il file di progetto secondo necessità. Ad esempio, nei progetti Java, utilizzo gradle che può generare un progetto di eclissi.

Makefiles. For example optimization may need to be turned off during debugging, but not for the CI server.

Dovresti essere in grado di passare dalla modalità di ottimizzazione a quella di debug senza modificare il Makefile. Invece, usa un flag a riga di comando, una variabile d'ambiente o un file separato non nel tuo repository per controllarlo.

Dirty ugly hacks. For example return 7 in the middle of a function, in order to test something, depending on the function, and suspected to break at value of 7. Or 7 is the code of the not yet implemented button, that I am implementing and need to test throughout the life of my branch.

Non puoi scrivere un test che induca il caso di sospetto fallimento?

Per la maggior parte dei casi, dovresti essere in grado di regolare il tuo flusso di lavoro in modo da non apportare queste modifiche ai file nel tuo repository. Quei file che vengono modificati localmente dovrebbero essere aggiunti al meccanismo di ignoranza del progetto e non essere nel repository. In alcuni casi, continuerai a apportare modifiche temporanee che non desideri vengano inserite nel repository. Per quelli, aggiungi una sequenza speciale come: XXX e aggiungi un hook pre-commit che rifiuta i commit che lo contengono ancora.

    
risposta data 24.07.2014 - 17:32
fonte
5

Il controllo della versione dovrebbe contenere il codice e la configurazione necessari per creare l'applicazione.

Questo significa che:

  • Cose temporanee introdotte per un breve periodo di tempo (il tempo necessario per individuare la posizione di un bug o per sperimentare una funzionalità di una lingua, ad esempio) non dovrebbero essere in un controllo di versione : mantienilo finché non ne hai bisogno, quindi rimuovilo semplicemente quando esegui il commit .

  • I file locali che sono appropriati per una macchina particolare possono essere tenuti in un ramo.

    Eviterei di tenerli solo localmente, dato che è troppo doloroso rifare tutto questo quando il tuo laptop viene rubato o un virus ti costringe a reinstallare il sistema operativo (e, a proposito, scopri che il tuo ultimo backup è stato fatto due anni fa).

    D'altro canto, fai attenzione con la struttura dei file: la configurazione locale è OK, finché non diventa schiacciante e ti costringe a fare una singola modifica in ogni file di ciascuno dei 42 sviluppatori che partecipano al progetto.

    Guarda l'opportunità di rimuovere le particolarità tra le macchine. Può significare:

    • Concedere l'accesso a un server SQL dev per sostituire le istanze locali sui computer degli sviluppatori,

    • Uso dei servizi di distribuzione dei pacchetti come Pypi o npm per i pacchetti pubblici e le loro controparti private per i pacchetti in-house,

    • Chiedi ai membri del team di installare le stesse versioni del software,

    • Rendi gli aggiornamenti software il più trasparenti possibile,

    • O consente di distribuire il sistema operativo e il software necessario su una macchina in un clic (più il tempo per ogni sviluppatore di installare il suo preferito Vim vs. Emacs, Chrome vs Firefox, ecc.)

Project files. Paths may need to be edited in order to reflect the layout on the current PC.

Perché non utilizzare lo stesso layout su ogni PC? I percorsi all'interno del progetto dovrebbero essere relativi al file di progetto, il che significa che non importa dove si trova il progetto. Le versioni di software e librerie sono le migliori per evitare errori criptici che appaiono solo su alcune macchine, e sono impossibili da riprodurre per gli altri membri del team.

Esempio:

In un progetto creato con Visual Studio, potresti trovare:

  • I file stessi. I percorsi sono relativi, non importa se sulla mia macchina, il progetto si trova in H:\Development\Hello World Project\ mentre altri membri del team hanno controllato il progetto in C:\Work\HelloWorld\ .

  • Le dipendenze, cioè le librerie di terze parti e interne. Entrambi i tipi devono essere gestiti da NuGet, il che rende obsolete tutte le discussioni relative ai conflitti. Se non hai la stessa versione della libreria che ho, chiedi a NuGet di aggiornare le dipendenze. Semplice come quello (quando funziona bene, che non è sempre il caso).

    Si noti che è fondamentale mantenere le librerie interne anche in un NuGet privato. Avere un gruppo di librerie memorizzate in una cartella condivisa o inviato via e-mail attraverso un team porta a anarchy e depressivi server CI.

  • Le impostazioni. È fondamentale che il team condivida le stesse impostazioni. Se metà della squadra decide di trattare gli avvertimenti come errori e metà della squadra mantiene gli avvertimenti così come sono, i membri della prima parte del team passeranno il loro tempo a rimuovere gli avvertimenti generati dagli sviluppatori dalla seconda parte del team.

  • Le impostazioni relative alle utilità. Sono complicati, perché alcuni membri del team potrebbero aver installato alcune utilità, mentre altri non lo hanno fatto.

    Si consiglia vivamente di installare lo stesso set di strumenti. Se alcuni programmatori vogliono usare StyleCop, ma altri no, il team non riuscirà a completare il lavoro. Se alcuni usano i contratti di codice ma altri no, avranno gli stessi problemi.

Makefiles. For example optimization may need to be turned off during debugging, but not for the CI server.

Mantieni più makefile nel controllo della versione. Non è raro creare una versione di debug sul server CI e inviarla a un client che presenta un bug insidioso.

Dirty ugly hacks. For example return 7 in the middle of a function, in order to test something, depending on the function, and suspected to break at value of 7.

Vorrei evitare tale codice in primo luogo. Per testare qualcosa, usa i test unitari. Se occorrono alcuni secondi per scambiare qualche codice allo scopo di debug , allora fallo, ma rimuovi questo codice in pochi minuti lo stesso, quindi non è necessario eseguirlo.

Come lo descrivi, dovresti scrivere un test. Ad esempio, se vuoi essere sicuro che:

class TemperatureConverter
{
    public int CelsiusToFahrenheit(int temperature)
    {
        ...
    }
}

genera un'eccezione quando temperature è inferiore alla costante AbsoluteZero , non dovresti giocare con il codice stesso . Invece, crea un test unitario che:

  • autocodifica il tuo codice,
  • aumentare l'affidabilità del tuo codice,
  • assicurati che i manutentori possano fare affidamento sui test di regressione quando modificano il metodo sopra,
  • servire ad altri sviluppatori del tuo team che potrebbero dover eseguire lo stesso test.
risposta data 24.07.2014 - 17:23
fonte
2

Utilizziamo @@ commenti nel codice per indicare che qualcosa non è ancora pronto, a scopo di test, ecc.

In questo modo possiamo impegnarci, i colleghi non devono aspettare troppo a lungo per la sincronizzazione e possono vedere dove sono ancora in corso i lavori (ad esempio, capire perché una parte non è ancora completamente funzionante).

Facciamo una ricerca globale per @@ per prevenire eventuali "avanzi" prima di entrare nelle fasi finali del test beta ecc.

Usando questa disciplina, non vedo alcun motivo per non solo commit. In questo modo, non abbiamo filiali separate e solo un "protocollo" aggiuntivo da seguire.

Come ulteriore vantaggio, queste cose da fare (di solito piccole cose) sono sempre nel codice. Lo sviluppatore che lavora su di loro può passarle rapidamente sopra, e non c'è bisogno di tenere liste separate.
Sai come va lo sviluppo: lavori in un posto ma usi costantemente la tua mente come una pila (' dovrei cambiarlo quando avrò finito qui '). Basta annotare un'eccellente istruzione @@ per evitare l'overflow dello stack.

Uso anche @@name per indicare i problemi che devo discutere con 'name'.

    
risposta data 24.07.2014 - 17:13
fonte
1

2 soluzioni HAMSTER:

  • Puoi utilizzare un hook pre-commit per controllare il tuo codice per alcune parole chiave insolite come HAMSTER. Non lasciare che le persone commettano il codice che è stato HAMSTERed e utilizzalo ogni volta che fai degli hack sporchi.

  • Un'altra opzione per esempio in C è usare #ifdef HAMSTER, quindi il codice verrà eseguito solo sulla tua macchina dove hai un flag HAMSTER per il compilatore.

risposta data 24.07.2014 - 21:08
fonte
0

Abbiamo messo tutto sotto il controllo del codice sorgente necessario per creare e testare i binari correnti e capire perché le cose sono state progettate / implementate / testate come sono.

Ciò vale anche per i link link , come quelli che hai descritto; li ospitiamo solo in un sotto-albero differente.

    
risposta data 24.07.2014 - 22:03
fonte
0

Ecco alcune soluzioni che uso occasionalmente da me in varie circostanze e che potresti considerare utile quando applicato ai tuoi flussi di lavoro:

  1. Rami leggeri che possono essere schiacciati.

    Git è bravissimo in questo. Hack su un ramo, fai molti commit e poi rebase o schiacci la cronologia per eliminare il rumore.

  2. Utilizza una coda di patch in cima al tuo SCM.

    Spesso mi trovo a usare StGit per far flottare le patch nella parte superiore del mio attuale ramo. Quando ho finito con il ramo, posso rimuoverli dallo stack prima di unirli, schiacciarli o ridirigerli, oppure posso unirli nella base di codice principale se voglio tenerli in giro.

  3. Utilizza RCS come SCM "fuori banda" per piccoli esperimenti.

    A volte vuoi solo controllare un file in corso in un modo usa e getta, senza dover ripulire la cronologia in seguito. Di solito uso RCS per questo all'interno di Git o SVN. Dico a Git di ignorare gli artefatti di RCS, il checkpoint del mio lavoro in corso in RCS e, quando mi piacciono i risultati, lancio semplicemente i file *,v o l'intera directory RCS. Non eseguire git clean -fdx o simili finché non hai impegnato il tuo lavoro nel tuo SCM "reale", altrimenti te ne pentirai.

  4. Stash con nome.

    Un altro Git-ismo, ma a portata di mano: git stash save --include-untracked <some-cool-title> può essere utile in un pizzico. Puoi salvare, eseguire pop e applicare lavori in corso in questo modo e visualizzare i vari checkpoint tramite git stash list o git reflog --all . Altri SCM possono avere caratteristiche simili, ma il tuo chilometraggio può variare molto con questo.

risposta data 25.07.2014 - 03:59
fonte
0

Alcuni di quei codici temporanei sono in realtà solo una manifestazione di metodi di build / test / sviluppo impropri, e si spera che la loro esistenza motiverà il miglioramento futuro.

Almeno su git, dovresti essere libero di gironzolare con qualsiasi numero di rami di feature finché non saranno pronti per essere uniti in master / trunk.

Il controllo della versione dovrebbe aiutarti e, molto spesso, apprezzo le intuizioni derivanti dal modo in cui gli errori (o forse solo le decisioni meno intuitive) sono stati fatti in passato e fanno decisioni più informate per il presente.

    
risposta data 25.07.2014 - 08:52
fonte
0

Credo che alcuni sistemi generino avvertimenti nel vedere TODO in un commento, quindi

// TODO: remove this hack.

potrebbe essere tutto ciò che è necessario se riesci a trovare un'opzione rilevante in qualche parte del tuo ambiente di sviluppo, o semplicemente inserisci una sorta di comando grep nel tuo file di build. Potrebbe anche essere possibile organizzare // HACK o qualsiasi stringa arbitraria da prelevare.

Questo è più semplice di organizzare il tuo codice in un modo particolare e sperare che le persone si ricordino di non usarlo. Rende anche più sicuro seguire il consiglio di @gbjbaanb (se puoi assicurarti che tutti stiano vedendo gli avvertimenti!).

Stick everything you like in there becuase one day you might want to see what it was, and those are the days you realise what your SCM is truly about.

    
risposta data 25.07.2014 - 14:38
fonte
0

Non è mai dannoso inserire il codice nel controllo del codice sorgente.

Ogni singolo elemento menzionato dovrebbe essere nel controllo del codice sorgente.

    
risposta data 27.07.2014 - 10:39
fonte

Leggi altre domande sui tag