2016-11-04 1 views
0

J'étudie les fonctionnalités interactives du git, dont le plus important pour moi est la fusion et la sélection de hunks. Cela fonctionne très bien mais j'ai besoin que les mecs soient plus petits. Lorsque vous travaillez avec des fichiers de code source, très souvent le morceau contient deux changements différents qui ne sont pas liés (normalement à quelques lignes l'un de l'autre). C'est probablement parce que git reconnaît les hunks avec une configuration donnée, comme des lignes séparées, ou un nombre de caractères ou quelque chose comme ça.GIT: comment configurer la reconnaissance hunks

Est-ce correct, et si oui, y a-t-il un moyen de changer/reconfigurer ce comportement?

Merci beaucoup,

+1

jeter un oeil à http://stackoverflow.com/questions/1122210/can-i-modify-git-adds-hunk-size – pedrorijo91

+0

Merci pedrorijo91, pas ce que je cherche. – repara2

Répondre

2

Si vous faites référence tout simplement git diff, la taille du contexte de gros morceau est configurable: il est défini par l'option -U, si elle est spécifiée, sinon de réglage diff.context, si elle est définie. Si tous échouent, la valeur par défaut est trois lignes de contexte (au-dessus et au-dessous).

Par conséquent:

$ git config --global diff.context 1 

réduit le contexte de diff à une ligne dans chaque direction, au lieu de 3. Il est également une valeur d'option --inter-hunk-context que vous pouvez utiliser pour fusionner plus beaux mecs ensemble (ce qui est le contraire de ce que vous voulez donc je le mentionne seulement pour l'exhaustivité, voir diff.interHunkContext, disponible dans Git 2.12 et plus tard, et voir aussi --function-context aka -W).

Cependant, git add --interactive fonctionne git diff-files ou git diff-index plutôt que simple git diff, et comme the git config documentation cleverly hides:

diff.autoRefreshIndex

            Lorsque vous utilisez git diff de comparer avec les fichiers d'arbres de travail, Ne tenez pas compte du changement de statistiques uniquement tel que modifié. Au lieu de cela, exécutez silencieusement git update-index --refresh pour mettre à jour les informations statistiques mises en cache pour les chemins dont le contenu dans l'arborescence de travail correspond au contenu de l'index. Cette option est définie par défaut sur true. Notez que cela ne concerne que git diff Porcelaine, et non des niveaux inférieurs diff commandes telles que les fichiers diff git.

(accent mis en gras).

Bien que cela parle de la mise en diff.autoRefreshIndex, il applique à tous des éléments configurables: git diff lit et obéit à votre configuration, mais git diff-index et git diff-files et ainsi de suite ne pas (intentionnellement, de sorte que les scripts qui doivent utiliser la plomberie commandes plutôt que de la porcelaine, peut obtenir le bon comportement indépendamment des options nouvellement ajoutées). En fin de compte, cela signifie que si vous faites spécifiquement référence à git add --interactive, la réponse est non, ou plutôt, pas sans un peu de travail. Le script interactif ajouter Perl utilise les commandes de plomberie, pas la porcelaine git diff, il doit donc obtenir et utiliser un tel paramètre lui-même.Il ne obtient et utilise vos paramètres diff.algorithm et diff.compactionHeuristic, mais il pas utilisez votre diff.context paramètre.

Rendre le faire est facile, mais nécessite de modifier légèrement Git:

diff --git a/usr/local/libexec/git-core/git-add--interactive b/tmp/git-add--interactive 
index 235fb88..ba001a1 100755 
--- a/usr/local/libexec/git-core/git-add--interactive 
+++ b/tmp/git-add--interactive 
@@ -47,2 +47,3 @@ my $normal_color = $repo->get_color("", "reset"); 

+my $diff_context_size = $repo->config('diff.context'); 
my $diff_algorithm = $repo->config('diff.algorithm'); 
@@ -753,2 +754,6 @@ sub parse_diff { 
     } 
+  if (defined $diff_context_size) { 
+    my $Uarg = sprintf("-U%d", $diff_context_size); 
+    splice @diff_cmd, 1, 0, "$Uarg"; 
+  } 
     if ($diff_compaction_heuristic) { 

(il peut y avoir une meilleure façon de mettre en place l'argument -U, mon Perl est maladroit). Le mode de correctif interactif (ou git add -p) nécessite que cet extrait soit ajouté s'il doit obéir à votre paramètre diff.context.

Bien sûr, vous pouvez simplement split (s) un gros morceau au cours add interactif, comme pedrorijo91 reminded us in a comment un lien vers Can I modify git-add's hunk size?, donc il n'y a pas de réel besoin pour cela. Cela pourrait être bien si c'était inclus, cependant.

+0

Exactement ce que je cherchais, merci beaucoup. – repara2

+0

"Il y a aussi une valeur d'option' --inter-hunk-context' (sans élément de configuration correspondant) "... eh bien, il y a maintenant (Git 2.12): Voir [commit c488867] (https: // github. com/git/git/commit/c488867793dc9b273c1d35746452d44afcd3d7f5) (12 janv. 2017) par [Vegard Nossum ('vegard')] (https://github.com/vegard). (Fusionné par [Junio ​​C Hamano - 'gitster' -] (https://github.com/gitster) dans [commit 8ec68d1] (https://github.com/git/git/commit/8ec68d1ae2863823b74d67c5e92297e38bbf97bc), 23 janvier 2017). – VonC

+0

@VonC: mise à jour, merci. – torek