2015-05-22 7 views
7

Il mio team sta pianificando di passare da Perforce a Git e sto cercando di trovare un modo per far sì che Git ignori le differenze della versione pom tra i rami. Funziona bene in Perforce e non ho alcuna fortuna nel riprodurre il comportamento con Git.C'è un modo con Git per fare in futuro che le unioni ignorino la differenza del numero di versione in un file pom tra le filiali?

Qui sono i miei passi:

  1. ramo Checkout genitore

    [email protected] /c/dev/proj/testgit (master) 
    $ git checkout release/1.0 
    Switched to branch 'release/1.0' 
    Your branch is up-to-date with 'origin/release/1.0'. 
    
  2. Crea ramo bambino da esso

    [email protected] /c/dev/proj/testgit (release/1.0) 
    $ git branch branch/FEA-650 
    
  3. passare alla nuova filiale

    [email protected] /c/dev/proj/testgit (release/1.0) 
    $ git checkout branch/FEA-650 
    Switched to branch 'branch/FEA-650' 
    
  4. Aggiornamento versione ramo bambino pom

    <version>1.0.0-FEA-650-SNAPSHOT</version> 
    
  5. Aggiungi e commettere

    [email protected] /c/dev/proj/testgit (branch/FEA-650) 
    $ git status 
    On branch branch/FEA-650 
    Changes not staged for commit: 
        (use "git add <file>..." to update what will be committed) 
        (use "git checkout -- <file>..." to discard changes in working directory) 
    
         modified: pom.xml 
    
    no changes added to commit (use "git add" and/or "git commit -a") 
    
    [email protected] /c/dev/proj/testgit (branch/FEA-650) 
    $ git add pom.xml 
    
    [email protected] /c/dev/proj/testgit (branch/FEA-650) 
    $ git commit -m "set feature branch pom version" 
    [branch/FEA-650 59e156e] set feature branch pom version 
    1 file changed, 1 insertion(+), 1 deletion(-) 
    
  6. Tornate al ramo genitore

    [email protected] /c/dev/proj/testgit (branch/FEA-650) 
    $ git checkout release/1.0 
    Switched to branch 'release/1.0' 
    Your branch is up-to-date with 'origin/release/1.0'. 
    
  7. Unisci ramo bambino in auto- genitore accettare la versione del ramo padre (usando la strategia di fusione “nostro”)

    [email protected] /c/dev/proj/testgit (release/1.0) 
    $ git merge branch/FEA-650 -s ours 
    Merge made by the 'ours' strategy. 
    
  8. Tentativo 2 ° fusione di bambino nel genitore (già up-to-date.) Buona. Questo è quello che voglio

    [email protected] /c/dev/proj/testgit (release/1.0) 
    $ git merge branch/FEA-650 
    Already up-to-date. 
    
  9. Checkout bambino e si fondono genitore in figlio (in avanti velocemente e attacca le diramazioni principali pom versione sul bambino). Non bene. Ho bisogno di dire "già up-to-date", come sopra e mantenere la versione ramo bambino pom come già è sul ramo bambino

    [email protected] /c/dev/proj/testgit (release/1.0) 
    $ git checkout branch/FEA-650 
    Switched to branch 'branch/FEA-650' 
    
    [email protected] /c/dev/proj/testgit (branch/FEA-650) 
    $ git merge release/1.0 
    Updating 59e156e..2f3a2a0 
    Fast-forward 
    pom.xml | 2 +- 
    1 file changed, 1 insertion(+), 1 deletion(-) 
    

Dopo il punto 7, vorrei si fonde in entrambe le direzione tra genitore e figlio per dire (Già aggiornato.)

C'è un modo con Git per rendere le future unioni ignora la differenza del numero di versione nel file pom tra le filiali?

+0

Non è possibile creare un alias che controlli le differenze e si unisca solo se ce n'è? Se non viene trovata alcuna differenza, puoi produrre tutto ciò che ti serve. –

+0

Non ho mai avuto a che fare con questo, ma vedo tre modi per affrontare il problema: (1) ignorare completamente i file POM e auto-generarli da metadati (ramo, ecc.); (2) utilizzare i filtri sfumino/pulito per inserire e rimuovere specifiche ramo (questo è un metodo intermedio tra 1 e 3); (3) scrivere driver di fusione personalizzati per tali file. Non avendo effettivamente fatto questo in pratica non posso dire quali metodi funzionano veramente o quali sarebbero i problemi. – torek

+0

Riguardo a (1) - Ignorare completamente i file pom non è un'opzione per me. Mi interessa ancora unire le altre linee in quei file. Per quanto riguarda (2) - ho trovato riferimenti a macchie e filtri nella documentazione in precedenza e non ho approfondito questo argomento. Non capisco perfettamente cosa siano e comincerò a leggere su di loro per vedere se può funzionare. Per quanto riguarda (3) - Mi piacerebbe evitare di scrivere un driver di fusione speciale. La possibilità di contrassegnare una differenza di linea come unita è qualcosa che ottengo gratis con perforce e mi piacerebbe trovare qualcosa di simile a quello in git. –

risposta

0

Probabilmente sarebbe oneroso farlo per ogni fusione, ma ecco un'idea.

git merge --no-ff --no-commit <other-branch>

git checkout HEAD -- pom.xml

Il primo comando consente di effettuare modifiche di contenuto prima della fusione completata, anche se non ce ne sono fondono conflitti. Il secondo sostituisce il pom.xml con qualunque cosa fosse nel commit precedente del ramo corrente, ignorando efficacemente pom.xml dall'altro ramo.

Utilizzare la strategia di unione - il nostro è problematico se ci sono conflitti in qualsiasi file diverso da pom.xml, quindi sarei stanco di usarlo per questo scopo.

+0

Grazie per la risposta. Ignorare tutte le future differenze di unione per l'intero file pom non è esattamente quello che sto cercando. Devo ancora essere in grado di unire il resto del file se altre parti di esso cambiano in futuro, ignorando automaticamente questa differenza di linea. –

+0

Nel sistema di controllo della versione da cui mi sto allontanando, ogni volta che creo un nuovo ramo, il prossimo passo è quello di cambiare solo la versione pom e quindi aggiornare la cronologia di unione in modo tale che solo la differenza di linea all'interno del pom sia contrassegnata come unita. Le unioni successive che hanno altre linee nel file che cambiano possono essere unite mentre questa linea di versione pom segue la risoluzione della prima unione che ignorava la differenza di versione. Gran parte dei nostri strumenti automatizzati dipende dalla possibilità di contrassegnare singole linee come questa come unite. Ho bisogno di un git per ricordare la risoluzione di questa linea tra le unioni. –

4

Il mio primo pensiero è di automatizzare i numeri di versione POM esternando parzialmente il calcolo POM <version>, vedere più in basso nella risposta. Se non vuoi farlo, devi rivalutare il tuo flusso di lavoro Git.

L'unione a due vie, in master e quindi di nuovo nel ramo di funzione causa problemi. Il tuo git merge branch/FEA-650 -s ours utilizzando la nostra strategia didice Git che avete integrato tutti i depositi e le modifiche dal ramo di caratteristica in master, compreso il vostro pom.xml cambio di versione, che si perde, con master conservando la sua versione. Il ramo principale ora considera l'elemento HEAD del ramo feature come un antenato comune (si tratta di un commit genitore nell'unione), quindi quando lo unisci al ramo della funzione, Git dice "tutto è stato risolto quando ti sei unito al master, non ci sono cambia ... avanti veloce ".

La semplice risposta è che si dovrebbe ri-ramo di un nuovo ramo di caratteristica dopo la fusione da padroneggiare, dando il vostro ramo di caratteristica un antenato nuova/in seguito più giovane comune, allora avete bisogno di riprodurre in qualche modo il tuo POM <version> cambiamento. Non si dovrebbe continuare a lavorare sul ramo della funzione originale, poiché è stato unito. Per raccogliere nuove modifiche dal master, dovresti cambiare ramo. Sembra esserci qualche implicazione nel fatto che potresti aver lasciato delle modifiche sul ramo della funzione non raggruppate con il master, altrimenti non ne avresti più bisogno e potresti cambiare ramo, o potrebbe essere semplicemente il commit di cambiamento <version> che ti interessa.

C'è un numero qualsiasi di modi per semplificare/accelerare/automatizzare la gestione del numero di versione su ramificazioni, dall'esternalizzazione (vedi sotto) a cherry-picking da un ramo segnaposto, usando un plugin Maven es. Versions Maven Plugin.

risposta originale

altro approccio sarebbe quello di calcolare esternamente la finale/efficace <version> fuori il file POM, in base ai metadati filiale o altro ingresso dal CI. Questo è un po 'complicato da fare a Maven senza pre-munging pom.xml dopo il checkout, ma dai uno sguardo allo Maven External Version Plugin.

Si aggancia nel ciclo di vita Maven e creerà un file pom.xml.new-version al volo (che è possibile .gitignore), in modo dinamico, sostituendo tutto o in parte il numero di versione, in base a ciò che si fornisce - un nome di funzione-ramo, git commettere hash ecc

build/distribuire il plugin e aggiungerlo al tuo POM:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-external-version-plugin</artifactId> 
    <version>0.1.0-SNAPSHOT</version> 
    <extensions>true</extensions> 
    <configuration> 
     <strategy hint="sysprop"/> 
    </configuration> 
</plugin> 

... poi essere creativi con sostituendo la versione-string, ad esempio è possibile:

mvn install -Dexternal.version-qualifier=$(git symbolic-ref --short HEAD| sed s_^master\$__) 

... che cambierà 1.2.3-SNAPSHOT a 1.2.3-FEA-650-SNAPSHOT se il ramo Git attuale estratto è FEA-650. Potrebbe essere necessario prendere in considerazione la sostituzione di / con - nella strategia di denominazione delle filiali, a seconda di cosa ne pensa Maven (trovo che lo / s confonda, ma sono solo io) o modificare lo sed di conseguenza.

Nel peggiore dei casi ciò consentirebbe di rimuovere il numero di versione dal tuo POM, in modo che altre modifiche POM possano essere unite in modo sicuro e note come non correlate a numero di versione - se necessario è possibile mantenere i numeri di versione in un altro file , utilizzando un plug-in Maven Properties per caricarli e, se necessario, sostituire l'intero numero di versione.

+0

Questo sembra un buon approccio alternativo al problema. Farò un tentativo dopo le vacanze. –

+0

Questo plugin non sta giocando bene con il plugin maven-jar. Quando aggiungo il plugin maven-external-version-plugin, il plugin jar ottiene questo errore (non un limite di caratteri sufficiente per la traccia dello stack completo). causati da: java.lang.NullPointerException a org.apache.maven.project.artifact.AttachedArtifact.getVersion (AttachedArtifact.java:138) –

+1

Poco prima che vedo: [INFO] vaso di costruzione: C: \ dev \ code \ myproject \ target \ myproject-4.0.0-EXT-VERSION-NATHAN-SNAPSHOT.jar e [ERRORE] Impossibile eseguire l'obiettivo org.apache.maven.plugins: maven-jar-plugin: 2.6 : test-jar (default) sul progetto myproject: default di esecuzione dell'obiettivo org.apache.maven.plugins: maven-jar-plugin: 2.6: test-jar fallito. NullPointerException -> [ –

Problemi correlati