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?
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 /"
Si vous ne le trouvez pas utile, vous pouvez le désactiver avec:
git config --global diff.noprefix true
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 (et autres VCS ), le flux de travail pour créer un patch pour plusieurs fichiers aurait pu être, par exemple, le suivant:
asdf
dans un répertoire asdf-source.latest
.asdf-source.new
, idéalement lien dur les fichiers à l'intérieur).asdf-source.new
, essayez de compiler le code, testez-le, etc.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:
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.
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).
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/".
Si vous souhaitez ajouter git diff --no-prefix
à votre . gitconfig manuellement, ajoutez simplement ce qui suit:
[diff]
noprefix = true