Gestione patch in un ambiente multi repository

5

Ecco il problema e il modo in cui attualmente lo gestiamo al lavoro.

Abbiamo una ricetta buildout che recupera più repository git. A volte, è necessario patch di un modulo da un repository che non possediamo (repository pubblico). Nella mia precedente posizione in un'azienda diversa, abbiamo utilizzato il fork di tutti i repository pubblici e il push delle patch in diversi rami. Funziona bene, ma in alcuni casi è molto più difficile da mantenere e, a volte, le patch sono davvero specifiche per un particolare client, quindi diventa difficile capire quali rami sono rilevanti e bifare oltre 50 repository non è particolarmente facile da gestire se devi dare il permesso di spingere agli sviluppatori. Allo stesso tempo, siamo riusciti a correggere i file che potevano essere applicati direttamente senza dover forgiare alcun repository.

Al mio attuale lavoro, ho deciso di limitarmi a correggere i file perché semplifica il processo. Applicare tecnicamente una patch e unire un ramo è praticamente la stessa cosa.

Le patch sono memorizzate su un repository per client e applicate nel processo di compilazione. Poiché con il recupero di più repository, alcune patch devono essere applicate su projectA e altre su projectB ...

In questo momento, sto scrivendo ogni singola patch che deve essere applicata nel file di configurazione build, ma mi chiedevo se c'era un modo per renderlo meno accoppiato con la configurazione.

Come invece di applicare una patch, applicherei un set di patch che sarebbe più vicino a un'unione che può applicare più "commit". Ma il set di patch dovrebbe essere in grado di applicare patch in più directory / repository. Le patch vengono generalmente create per il repository specifico utilizzando git format patch .

    
posta Loïc Faure-Lacroix 20.02.2017 - 12:34
fonte

2 risposte

3

Per lo scenario simile abbiamo usato uno strumento Quilt - utility per la gestione dei set di patch: link

Fondamentalmente hai una directory patch nella root del tuo progetto che contiene diverse patch indipendenti, gestite dalla quilt . La directory patch potrebbe avere questo aspetto:

patches/100_asserts.diff
patches/101_terminate_call.diff
patches/102_status_code477.diff
patches/107_parser.diff
patches/110_ssldefault.diff

Le patch sono applicate in modo sequenziale ( quilt push ), possono essere applicate inapplicabile ( quilt pop ),  aggiornato ( quilt refresh ) e così via. Ha senso separare le patch ai file in base alla loro logica.

Nella situazione con più repository è possibile creare un nuovo repo git wrapping con dipendenze come sottomoduli git.

patches/  <-- patches repo01, repo02
repo01/   <-- git submodule
repo02/   <-- git submodule

In questo esempio, la directory delle patch è gestita da git.

Nel caso di utilizzo del singolo repository, abbiamo usato il fork del repository, aggiunto la directory delle patch e mantenuto le patch nello stesso repository.

L'aggiornamento è anche fattibile: pop-ing tutte le patch di quilt pop -a , git pull , quilt push patch una per una, risolve il conflitto se necessario, di solito quilt refresh fa il lavoro.

Ci sono anche strumenti che si integrano direttamente con git:

risposta data 04.05.2017 - 10:49
fonte
0

Da quello che ho capito nella tua domanda, potresti usare le patch troppo spesso quando la soluzione migliore potrebbe usare direttamente il sistema di controllo delle versioni. Le patch sono state fatte solo per soluzioni rapide.

Quindi, se stiamo usando repository che non possediamo, possiamo usare:

  • patch su una versione di repository pubblico
    • ma chiedi la nostra integrazione di patch al più presto, al fine di utilizzare il repository direttamente senza patch quando possibile, riducendo le patch da applicare.
  • clone / fork il repository pubblico e mantenere la nostra evoluzione organica (e ad esempio utilizzare Submodules da integrare nel nostro progetto completo) [questo equivale ad avere patch sul repository pubblico] ( come lavorare con i sottomoduli)

Se "le patch sono veramente specifiche per un particolare client", forse non vogliamo affatto applicare patch a questi repository pubblici (è stato costruito pensando a un'altra filosofia / casi d'uso / architettura in mente), ed è meglio usare alternative come:

  • fai le modifiche nel nostro codice che utilizza questi repository esterni
  • crea un decoratore / wrapper del repository esterno
  • usa un repository pubblico esterno alternativo (o creane uno nostro)

So che hai richiesto uno strumento di gestione delle patch. Ma questo sembra solo un sistema di versioning (SVN, git, mercurial)!

Tuttavia, se è davvero necessario utilizzare un sistema di patch, è possibile creare un file di configurazione su projectA, un altro su projectB, (etc) che descriverà le patch necessarie da utilizzare. E le patch saranno presenti in un repository indipendente.

    
risposta data 21.02.2017 - 13:40
fonte

Leggi altre domande sui tag