2012-02-15 16 views
18

Ho la seguente storia git:git ramo stabile: trovare non ciliegia-raccolto impegna

A --- B --- C --- D' --- E' [master] 
\ 
    \ --- D --- E --- F [stable] 

Abbiamo una politica di cherry-pick tutte le modifiche da stabile a padrone; D 'ed E' vengono scelti con la ciliegia da un ramo stabile, F non viene raccolto con la ciliegia (è stato dimenticato).

Come posso ottenere un diff che accoda F (che non è stato selezionato in master)?


Non vogliamo uso merge perché:

  • pulitore di storia senza merge commette
  • impegna a stabile sono rari
  • abbiamo un sacco di diversi rami stabili

risposta

13

Questo è esattamente ciò che il comando git cherry è per.

Non dovrebbe mai mancare una modifica senza modifiche, ma potrebbe occasionalmente elencare una modifica che si considera selezionata se il plettro ha richiesto la risoluzione del conflitto.

+0

vorrei che fosse opzione --no-fonde che git log ha. – angularsen

+1

@anjdreas Sembra che la ciliegia non elabori i commit di unione, con git 2.13.2. – fossilet

-2

Il comando Git non è in grado di risolvere questo problema. Ho scritto questo script, può aiutare.

Script 1 calcola la base di unione di entrambi i rami branch1 e branch2. Quindi crea due liste da unire base a capo di branch1 e branch2 rispettivamente. Quindi crea una tabella hash di commit su branch2 con md5sum del messaggio di commit. Quindi passa attraverso la lista di commit di branch1 e controlla se esiste in branch2 hashtable o no?

Nel caso sopra Branch1 è stabile e Branch2 è padrone

#!/bin/bash 

## Usage: ./missing_cherrypicks.sh branch1 branch2 
## This script will find commits in branch1 missing in branch2 
## Final list of missing commit will be in file missing_commits_branch1_branch2.csv 

branch1=$1 
branch2=$2 

# Calculate mergebase of branch1 and branch2 
mb=`git merge-base origin/$1 origin/$2` 
rm -rf missing_commits_${branch1}_${branch2}.csv 
echo "COMMIT,AUTHOR,MESSAGE,FILESLIST" >> missing_commits_${branch1}_${branch2}.csv 

# Get commit list on both branches from merge-base 
declare -a commitlist1=`git rev-list $mb..origin/$1` 
declare -a commitlist2=`git rev-list $mb..origin/$2` 

## Make HashKey for branch2 
declare -A CommitHash 
for com2 in ${commitlist2[@]} 
do 
    message2=`git log --pretty=oneline $com2 | head -1| sed "s/${com2} //" | sed 's/ *$//' | cut -c1-35` 
    hashkey=`echo $message2 |md5sum |xargs | awk '{print $1}'` 
    CommitHash[${hashkey}]=$com2 
done 

# Find commits of commitlist1 and check if they are in commitlist2 
for com1 in ${commitlist1[@]} 
do 
    message1=`git log --pretty=oneline $com1 | head -1| sed "s/${com1} //"| sed 's/ *$//'| cut -c1-35` 
    hashkey1=`echo $message1 |md5sum |xargs | awk '{print $1}'` 
    if [[ -z ${CommitHash[${hashkey1}]} ]] 
    then 
     echo "------$com1-----------" 
     author=$(git show $com1 |grep ^Author:|awk -F":" '{print $2}') 
     fileslist=`git diff-tree --no-commit-id --name-only -r $com1` 
     fl="" 
     for file in ${fileslist[@]} 
     do 
      fl=${fl}":"$file 
     done 

     echo "------$author-------" 
     echo "$com1,$author,$message1,$fl" >> missing_commits_${branch1}_${branch2}.csv 
    fi 
done 
+1

Potresti per favore elaborare * come * e * perché * questo risolve il problema degli OP? Basta incollare del codice non è una buona risposta, mentre tecnicamente può rispondere alla domanda. –

+0

Script 1 calcola la base di unione di entrambi i rami branch1 e branch2. Quindi crea due elenchi da unisci base a capo di branch1 e branch2 rispettivamente. Quindi crea una tabella hash di commit su branch2 con md5sum del messaggio. Quindi passa attraverso la lista di commit di branch1 e controlla se esiste nella tabella hash branch2 o meno. –

+0

Nel caso precedente, branch1 è stabile e branch2 è master. –

Problemi correlati