Come stai applicando il comportamento di git, anche a livello locale (in particolare su Windows)?


13

Sto prendendo in considerazione lo spostamento di questo negozio .NET da svn a git e ho identificato alcuni problemi accessori per i quali mi piacerebbe avere una soluzione prima di cambiare interruttore.

Quello di cui mi sto chiedendo in particolare in questa domanda è l'applicazione del fine linea. Per impostazione predefinita, git per Windows si installa con "checkout crlf, commit lf", che non funzionerà per un gruppo di sorgenti che (per quanto ne so) sono costituite esclusivamente da finali crlf.

Non so che mi sarei fidato ciecamente di un determinato sviluppatore per configurare correttamente anche queste date istruzioni, quindi sto prendendo in considerazione una (o entrambe) le seguenti, ma ero curioso di sapere se qualcuno qui avesse seguito un'altra strada.

  • Un hook di pre-commit che controlla eventuali finali di linea (o forse tutti i finali di linea) e rifiuta in quell'evento.
  • Uno script di installazione distribuito agli sviluppatori che popola la configurazione globale con "così com'è, così com'è".

PS Mentre scrivevo, mi è venuto in mente che la conversione iniziale da svn a git poteva essere commessa nel modo predefinito e fintanto che le persone rimanevano fedeli al valore predefinito sarebbe anche abbastanza semplice. Essendo stato uno sviluppatore usando git in un negozio .NET che ha installato git con 'as-is, as-is' non predefinito, ho creato anche qui i miei problemi (avevano tutti implementato il default prima del mio arrivo) . Quindi sono ancora incline a una sorta di meccanismo di controllo.


2
Con un server hook di pre-ricezione questo dovrebbe essere gestibile (assicurati che le terminazioni crlf e falliscano in caso contrario), con un hook di aggiornamento dovresti essere in grado di aggiornare anche la pre-unione. Che tipo di server git stai usando? Se questo deve essere fatto dal lato workstation, un Configuration Manager può essere la strada da percorrere, ma più difficile e con un sacco di aspetti negativi. L'ultima risorsa è sfuggire alla CI e non riescono a far rispettare le procedure alle persone
Tensibai,

1
Sono d'accordo con Tensibai e aggiungerei che l'opzione che selezioni dovrebbe basarsi su quanto ritieni che debba essere applicato. Ganci pre-commit per un'applicazione rigorosa, linting per i report di conformità post-commit.
Dave Swersky,

Grazie Dave, la mia logica per l'applicazione lato client / più rigorosa è che comporterebbe meno lavoro generale per me e colpirà gli errori prima. Non andando su CM le workstation degli sviluppatori, ma i server degli sviluppatori sono tutti in DSC, quindi aggiungere sarà banale. Modifica: Grazie anche a @Tensibai ... potresti approfondire quei lati negativi che vedi sul lato client?
ndarwincorn,

1
Soprattutto se si impone un lato client hook globale si potrebbe finire per impedire il lavoro su progetti che richiedono finali. E devi configurarlo in qualche modo, non puoi essere sicuro che tutti seguiranno la configurazione corretta. Sono sicuro che ci sono altre pistole a cui non penso in questo momento
Tensibai,

Che cosa hai fatto per risolvere il tuo problema?
Newtopian,

Risposte:


6

Per rispondere alla domanda su come applicare qualcosa a livello locale, non puoi fare a meno di sollevare molto pesantemente la gestione e il rispetto dello stato di ogni workstation degli sviluppatori, e di solito sono dell'opinione che gli sviluppatori dovrebbero probabilmente essere amministratori locali del loro sviluppo macchina perché se non lo sono, passeranno il loro tempo a capire come ottenere questi privilegi comunque.

E questo probabilmente perché non dovresti preoccuparti dello stato della configurazione locale quando usi il controllo della versione distribuita. Dovresti preoccuparti solo dello stato della tua configurazione. Supponendo che tu stia usando git come un sistema di controllo versione centralizzato, perché è quello che praticamente tutti fanno comunque perché è più semplice, quindi supponiamo che la "tua" configurazione sia la copia del codice salvato sul server centrale.

In questo caso, non dovresti accettare le unioni che, come hai detto, interrompono le terminazioni di riga crlf / lf. Quindi imponi che quando un altro client tenta di eseguire il push ti cambi con la logica lato server che rifiuta la richiesta di inquinare il tuo repository con le loro scelte stilistiche potenzialmente spezzanti.


4

Richiediamo un processo di revisione utilizzando le richieste Pull in github sui nostri principali sviluppatori o rami master. Durante tale processo di revisione, contrassegneremo le richieste pull come richieste di modifiche se molti file presentano differenze di spazio bianco o di fine riga e insistiamo sul fatto che seguono la formattazione dello sviluppo o del ramo principale per cui stanno effettuando la richiesta pull.

Ci sono anche alcuni strumenti utili a seconda delle lingue che usi e degli strumenti CI che usi, che possono, durante il processo di compilazione o estrarre il passaggio della richiesta, formattare automaticamente il codice in base alle regole che hai impostato. Ciò aiuta anche a mantenere coerente il codice e a minimizzare i problemi di formattazione durante il commit del codice.


Ti andrebbe di approfondire gli strumenti che stai utilizzando? Dato che ci sono molti modi per raggiungere questo obiettivo, e ne abbiamo i nostri ma non li abbiamo ancora implementati in questo modo, sono curioso di sapere come lo stai risolvendo.
ndarwincorn,

1
Stiamo usando dattiloscritto, github e jenkins. Typescript ha un bel ecosistema per questo tipo di cose.
avi

3

È possibile utilizzare la configurazione per repository per sovrascrivere la configurazione dell'utente in base al repository. Se eseguito sul repository considerato come la fonte centrale, dovrebbe propagarsi con i cloni e trascinare verso altri repository, inclusi quelli locali, annullando così centralmente la configurazione locale.

È possibile applicare ulteriormente questo tramite hook nel repository centrale per verificare che le terminazioni dei file siano quelle che dovrebbero essere e rifiutare l'unione / push se non fosse kosher. Tuttavia, questi hook non verranno clonati con il repository, almeno non direttamente, ma ciò non è necessario poiché le regole devono solo essere applicate sul repository centrale.

Uso dei modelli nel vostro git init è possibile garantire che i pronti contro termine sono creati uguali con tutti i file del gitignore, gitattributes ecc solo il modo in cui si desidera che siano.

L'ultima cosa, non direttamente correlata alla tua domanda, ho trovato il più grande punto di attrito quando ho portato il team svn saavy in un flusso di lavoro basato su git cosa abituarli al repository extra nel mezzo. Ho scoperto che questo foglio di indicazione visiva ha aiutato a spiegare un po 'quale comando ha avuto l'effetto su quale parte.

Spero che questo abbia aiutato un po '.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.