2016-02-25 23 views
8

Vorrei cercare i rami git per qualsiasi file modificato in comune tra il mio e tutti gli altri, come metodo di rilevamento precoce dei conflitti. C'è un metodo che git mi permetterebbe di fare ciò che sto trascurando (o tramite script di shell)?Cerca i rami git per il file in comune

Il metodo che ho pensato per ora è, come un post-commit hook:

  1. Esecuzione di un git diff --name-only master sul ramo mi trovo, per determinare tutti i file sarò alla ricerca di in altri rami (per generare un elenco di filiali in conflitto)
  2. Ricerca/grep'ing per ogni file che ho ottenuto (nel passaggio precedente) in altri remote rami di tutti tramite git diff --name-only origin/<remote branch> origin/master sul repository remoto
  3. Restituzione di un elenco di rami che contengono uno o più file t conflitto di cappello, basato sui risultati della mia ricerca/grep.

risposta

4

maggior parte dei metodi disponibili sono elencati in "How can I preview a merge in git?"

Il secondo passo si parla è uno dei più veloci (rispetto alla realtà eseguire l'unione con --no-ff e --no-commit)

git diff --name-status origin/abranch 

(rispetto a HEAD per impostazione predefinita)

È possibile add a status filter, poiché si cercano i file modificati (file comuni tra branche s con modifica)

Nessuna necessità del primo passaggio: il secondo elencherà direttamente i file modificati comuni rispetto a HEAD.

git diff --name-status --diff-filter=M origin/abranch 
+0

Ho rivisto la mia domanda in quanto ritengo che ero poco chiaro, ma i comandi in http://stackoverflow.com/a/33267627/1034537 è essenzialmente un esempio di script bash lo farei creare nel mio scenario (tranne che vorrei scorrere tutti i rami remoti). – BLaZuRE

+0

@BLaZuRE semplicemente loop sui rami di tracciamento remoto ed esegui 'git diff --name-status --diff-filter = M origin/abranch' su ciascuno. Otterrai la tua lista di file comuni modificati (candidato per potenziali conflitti) – VonC

3
potentially-conflicting-changes-between() { 
     local base=`git merge-base $1 $2` 
     { git diff --name-only $base $1 
      git diff --name-only $base $2 
     } | sort | uniq -d 
} 

mostrerà tutti i file che si fondono avrebbe esaminato la presenza di conflitti, allora è solo una questione di esecuzione gli arbitri, più semplice potrebbe essere

for other in `git branch -r`; do 
     printf '--- \n%s %s\n' master $other 
     potentially-conflicting-changes-between master $other 
done 

È anche possibile fare la bassa -level unisce la preparazione direttamente per eliminare i falsi positivi su modifiche identiche, questo potrebbe risparmiare molto tempo ma elenca i dettagli dell'indice per tutti i potenziali conflitti e controlla se l'unione potrebbe effettivamente essere eseguita nel tuo attuale albero di lavoro senza omping sul lavoro non impegnati

potentially-conflicting-changes-between() 
{ 
    (export GIT_INDEX_FILE=`git rev-parse --git-dir`/scratch-index; 
    git read-tree --empty; 
    git read-tree -m $(git merge-base $1 $2) $1 $2; 
    git ls-files -u) 
} 
+0

Simpatico script. +1 – VonC

+0

Grazie. . . . hm. Mi viene in mente il mio comando preferito è solo il biglietto qui. – jthill

+0

git merge-base? (http://stackoverflow.com/a/24376032/6309) – VonC