2014-04-17 10 views
10

Sto cercando di aggiungere una strategia di fusione personalizzato simile a quello in questa domanda: Git merge conflict to always take the newest filegit: Come aggiungo una strategia di unione personalizzata?

ho salvato lo script come git-merge-latest.sh e ha aggiunto le seguenti righe: .git/config

[merge "latest"] 
    name = select latest file merge driver 
    driver = git-merge-latest.sh %O %A %B 

Tuttavia, quando corro git pull --strategy latest, ricevo il seguente messaggio:

Could not find merge strategy 'latest'. 
Available strategies are: octopus ours recursive resolve subtree. 

ho provato il controllo git config merge.latest.driver, che restituisce l'output previsto. Ho anche cambiato il valore di driver a true solo per verificare che non fosse un problema con la ricerca dello script.

Ciò si verifica su due sistemi diversi che eseguono git 1.8.2.2 e 1.7.9.5. Che cosa sto facendo di sbagliato?

risposta

18

In questo caso, non è stato configurato una strategia merge, si è configurato un driver merge:

Una strategia unione è un programma che determina come due (o più) commette sono fuse . Per impostazione predefinita, git merge utilizza la strategia "ricorsiva", trovata nel programma git-merge-recursive. Specificando il flag su git-merge (o git-pull), si dice di richiamare una strategia diversa. Se si desidera collegare la propria strategia di unione, è possibile, creando un eseguibile git-merge-mystrategy nel percorso e in esecuzione git merge --strategy mystrategy.

Questo è diverso da un driver di unione. Un driver di unione è il meccanismo utilizzato per risolvere un conflitto su un file esistente quando si uniscono due commit. Si collega il proprio driver di fusione nel modo descritto, configurando un'impostazione merge.mydriver.driver.

Per abilitare il driver di unione per un determinato file, è necessario configurare il driver per quel file in .gitattributes:

filename merge=mydriver 
+0

potrebbe voler dichiarare esplicitamente che l'aggiunta di una strategia di unione è una questione di modificare il 'git 'codice - non è qualcosa che può essere fatto attraverso le modifiche di configurazione (almeno al momento) ... – twalberg

+1

@twalberg - è possibile collegare il proprio abbastanza facilmente, in realtà; se hai un 'git-merge-xyz' nel tuo percorso allora git lo eseguirà se tu 'git unisci --strategy xyz'. Lo renderò più chiaro nella mia risposta. –

+2

Le specifiche per come scrivere un eseguibile di strategia git merge documentato ovunque? Cosa devo aspettarmi su stdin e quale dovrebbe essere l'output? –

Problemi correlati