2016-02-25 2 views
8

Je voudrais rechercher des branches git pour tous les fichiers modifiés en commun entre le mien et tous les autres, comme une méthode de détection précoce des conflits. Y at-il une méthode que git me permettrait de faire cela que je suis en train de négliger (ou via scripting shell)?Rechercher des branches git pour le fichier en commun

La méthode que j'ai pensé pour l'instant est, comme un crochet post-commit:

  1. Réalisation d'une git diff --name-only master sur la branche où je suis, pour déterminer tous les fichiers que je vais être à la recherche dans d'autres branches (pour générer une liste des branches en conflit)
  2. Recherche/grep'ing pour chaque fichier que j'ai obtenu (à l'étape précédente) dans d'autres branches à distance de tout le monde via git diff --name-only origin/<remote branch> origin/master sur le dépôt distant
  3. retour d'un liste des branches contenant un ou plusieurs fichiers t conflit de chapeau, basé sur les résultats de ma recherche/grep.

Répondre

4

La plupart des méthodes disponibles sont répertoriés dans « How can I preview a merge in git? »

La deuxième étape que vous mentionnez est l'un des plus rapides (par rapport à réellement effectuer la fusion avec --no-ff et --no-commit)

git diff --name-status origin/abranch 

(par rapport à HEAD par défaut)

Vous pouvez add a status filter, puisque vous recherchez des fichiers modifiés (fichiers communs entre branche s avec modification)

Pas besoin de la première étape: la seconde liste directement les fichiers modifiés courants par rapport à HEAD.

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

J'ai revu ma question car je sens que je n'étais pas claire, mais les commandes http://stackoverflow.com/a/33267627/1034537 est essentiellement un exemple du script bash je voudrais créer dans mon scénario (sauf que je boucle à travers toutes les branches distantes). – BLaZuRE

+0

@BLaZuRE simplement boucle sur vos branches de suivi à distance et faire le «git diff - nom-statut - filtre-différentiel = M origine/abranch» sur chacun. Vous obtiendrez votre liste de fichiers modifiés communs (candidat pour les conflits potentiels) – 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 
} 

montrera tous les fichiers qui fusionnent examinerait les conflits, il est juste une question de l'exécution des refs, la plus simple est

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

Vous pouvez également faire le faible -level merge prep directement pour éliminer les faux positifs sur des changements identiques, cela pourrait gagner beaucoup de temps mais listera les détails de l'index pour tous les conflits potentiels et vérifie si la fusion pourrait réellement fonctionner dans votre worktree actuel sans st omping sur le travail non validé

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

Nice script. +1 – VonC

+0

Merci. . . . hm. Il me vient à l'esprit que ma commande préférée est juste le ticket ici. – jthill

+0

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