web-dev-qa-db-fra.com

Quelle est la raison des préfixes / a / b de git diff

J'utilise git depuis quelques années maintenant et je me suis toujours demandé pourquoi git diff préfixe les noms des fichiers modifiés avec a/et b /. Je m'attendais à tomber sur un cas d'utilisation où il est utile, mais jusqu'à présent, c'était toujours ennuyeux et jamais utile.

À quoi ça sert? Pourquoi est-ce activé par défaut? Dans quelles situations est-ce utile?

60
mkl

Comme mentionné dans la page de manuel diff , a/et b/représentent le préfixe pour différencier la source et la destination.

En fait, vous avez les options:

--no-prefix

N'affichez aucun préfixe de source ou de destination.

--src-prefix=<prefix>

Affiche le préfixe source donné au lieu de "a /".

--dst-prefix=<prefix>

Afficher le préfixe de destination donné au lieu de "b /"

45
VonC

Si vous ne le trouvez pas utile, vous pouvez le désactiver avec:

git config --global diff.noprefix true
28
Will Sheppard

Ces préfixes de répertoire sont là essentiellement pour la compatibilité et choisis comme valeurs par défaut sensibles. L'explication suit.

Avant git

Avant git (et autres VCS ), le flux de travail pour créer un patch pour plusieurs fichiers aurait pu être, par exemple, le suivant:

  • Disons que vous avez un code source d'un projet asdf dans un répertoire asdf-source.latest.
  • Vous copiez le répertoire dans un nouveau répertoire (par exemple asdf-source.new, idéalement lien dur les fichiers à l'intérieur).
  • Vous pouvez maintenant effectuer toutes vos modifications dans asdf-source.new, essayez de compiler le code, testez-le, etc.
  • Une fois que vous avez terminé, vous créez un patch en utilisant par exemple diff -r asdf-source.latest asdf-source.new >new_feature.patch. La sortie a également évolué dans le temps. Hormis d'autres choses, git utilise une sortie "unifiée" par défaut, qui peut être acquise en utilisant -u paramètre.

Vous pouvez maintenant voir que le patch a des chemins vers des fichiers modifiés en utilisant les noms de répertoire.

La personne (ou le script de construction, etc.) appliquant votre correctif utilisera alors patch au lieu d'utiliser git apply ou git am. Pour que la commande trouve les fichiers appropriés, le nom du répertoire doit être supprimé du chemin, en utilisant -pN option (N indique le nombre de noms de répertoires et de séparateurs à supprimer). Dans le cas ci-dessus, la commande utilisée pourrait être patch -p1 <new_feature.patch. Cela permet au créateur du patch d'utiliser ses propres noms de répertoire.

Si vous rencontrez un script corrigeant un projet utilisant beaucoup de correctifs (généralement utilisé pour les correctifs back-ported pour les versions de package stables dans les distributions Linux par exemple), les correctifs peuvent varier dans le format. La commande patch est capable de détecter ces formats correctement, mais elle est un peu plus difficile avec les chemins (combien de répertoires supprimer). Quelques problèmes avec ça:

  • Forcer les développeurs à utiliser 0 répertoires n'est pas très sympa.
  • Avoir patch rechercher le fichier peut être dangereux (car il peut trouver un fichier différent).

Donc, tout le monde envoie des correctifs qui peuvent être appliqués avec patch -p1 semble la voie la plus sensée à prendre.

Retour à git

Lorsque git a été créé, il a adopté des valeurs par défaut raisonnables (qui sont compatibles avec la plupart des directives de soumission de projet, principalement le noyau) pour ces options. Grâce à cela, vous pouvez utiliser git et envoyer un correctif correctement formaté à quelqu'un qui utilise patch pour l'appliquer et vice versa (git est également capable de gérer diff- les correctifs créés). Avoir "a" et "b" comme préfixes en particulier permet d'économiser de l'espace (et un petit pourcentage de bande passante) tout en gardant tout fonctionne.

Vous pouvez définir git config diff.mnemonicprefix true pour que git utilise différents préfixes en fonction de ce que vous comparez (voir git help config pour plus de détails).

14
nert

C'est pour différencier la source et la destination. Vous pouvez également le modifier pour qu'il soit plus significatif:

--src-prefix = <prefix>

Show the given source prefix instead of "a/".

--dst-prefix = <prefix>

Show the given destination prefix instead of "b/".

http://git-scm.com/docs/git-diff

6
manojlds

Si vous souhaitez ajouter git diff --no-prefix à votre . gitconfig manuellement, ajoutez simplement ce qui suit:

[diff]
noprefix = true
4
arush436