Quel est le but de `text = auto` dans le fichier` .gitattributes`?

129

Surtout le .gitattributesfichier a * text=auto. Quel est le but de text=autoce fichier?

Fizer Khan
la source

Réponses:

77

À partir de la documentation :

Chaque ligne dans .gitattributes(ou .git/info/attributes) fichier est de la forme:

pattern attr1 attr2 ...

Donc, ici, le modèle est *, ce qui signifie tous les fichiers, et l'attribut est text=auto.

Que fait text=auto-on? De la documentation:

Lorsque le texte est défini sur "auto", le chemin est marqué pour la normalisation automatique de fin de ligne. Si Git décide que le contenu est du texte, ses fins de ligne sont normalisées à LF lors de l'archivage.

Quel est le comportement par défaut s'il n'est pas activé?

Non spécifié

Si l'attribut text n'est pas spécifié, Git utilise la variable de configuration core.autocrlf pour déterminer si le fichier doit être converti.

Que fait core.autocrlf-on? À partir de la documentation:

   core.autocrlf

Définir cette variable sur "true" revient presque au même que définir l'attribut de texte sur "auto" sur tous les fichiers, sauf que la normalisation des fichiers texte n'est pas garantie: les fichiers contenant CRLF dans le référentiel ne seront pas touchés. Utilisez ce paramètre si vous souhaitez avoir des fins de ligne CRLF dans votre répertoire de travail même si le référentiel n'a pas de fins de ligne normalisées. Cette variable peut être définie sur entrée, auquel cas aucune conversion de sortie n'est effectuée.

Si vous pensez que tout cela est aussi clair que la boue, vous n'êtes pas seul.

Voici ce que * text=autofait dans mes mots: quand quelqu'un valide un fichier, Git devine si ce fichier est un fichier texte ou non, et si c'est le cas, il commettra une version du fichier où tous les octets CR + LF sont remplacés par des octets LF. Cela n'affecte pas directement l'aspect des fichiers dans l'arborescence de travail, il existe d'autres paramètres qui convertiront les octets LF en octets CR + LF lors de l'extraction d'un fichier.

Recommandation:

Je ne recommanderais pas de mettre * text=autodans le .gitattributesfichier. Au lieu de cela, je recommanderais quelque chose comme ceci:

*.txt text
*.html text
*.css text
*.js text

Cela désigne explicitement les fichiers qui sont des fichiers texte, qui sont convertis en CRLF en LF dans la base de données d'objets (mais pas nécessairement dans l'arborescence de travail). Nous avions un dépôt avec * text=auto, et Git a deviné à tort pour un fichier image qu'il s'agissait d'un fichier texte, ce qui l'a corrompu en remplaçant les octets CR + LF par des octets LF dans la base de données d'objets. Ce n'était pas amusant à déboguer.

Si vous devez utiliser * text=auto, placez-le comme première ligne .gitattributesafin que les lignes suivantes puissent la remplacer. Cela semble devenir une pratique de plus en plus populaire.

Flimm
la source
2
Pourquoi tout le monde appelle LF comme Normal mais pas CRLF? y a-t-il une référence pour le prouver?
Yousha Aleayoub
1
@YoushaAleayoub Que voulez-vous dire?
Flimm
1
@YoushaAleayoub si votre everyonefait référence à git-scm, c'est probablement parce qu'ils développent un package * nix et donc utiliser le caractère de nouvelle ligne * nix est normal .
Justin Moh
4
@YoushaAleayoub LF est considéré comme "normal" b / c il est courant dans de nombreux outils de développement. Des outils de développement populaires comme git-scmvenant de * nix. MacOS utilise LF. Seul Windows (compte tenu des systèmes d'exploitation de flux principal uniquement) utilise CRLF. Cela rend la tâche plus difficile pour les développeurs utilisant les outils * nix sous Windows et pour tout le monde lors de l'échange de fichiers. Voir aussi Pourquoi CRLF .
Roi Danton
2
@Flimm, pouvez-vous expliquer la différence entre *.txt text=autoet *.txt texts'il vous plaît? Je pensais que les 4 lignes de votre exemple ci-dessus auraient dû être text=auto, pas seulement textaprès l'extension de fichier. Les fichiers d'empreintes KiCad, par exemple (extension ".kicad_mod"), sont normalisés en utilisant cette ligne dans leur fichier gitattributes: *.kicad_mod text=auto( kicad-pcb.org/libraries/klc/G1.7 ).
Gabriel Staples
64

Il garantit que les fins de ligne sont normalisées. Source: Kernel.org

Lorsque le texte est défini sur "auto", le chemin est marqué pour la normalisation automatique de fin de ligne. Si git décide que le contenu est du texte, ses fins de ligne sont normalisées à LF lors de l'archivage.

Si vous souhaitez interagir avec un système de gestion de code source qui applique la normalisation de fin de ligne, ou si vous voulez simplement que tous les fichiers texte de votre référentiel soient normalisés, vous devez à la place définir l'attribut texte sur "auto" pour tous les fichiers.

Cela garantit que tous les fichiers que git considère comme du texte auront des fins de ligne normalisées (LF) dans le référentiel.

Dave Zych
la source
12
Qu'entendez-vous par fin de ligne normalisée?
Fizer Khan
14
When a text file is normalized, its line endings are converted to LF in the repository.
Dave Zych
11
Important à savoir, cela écrase le paramètre local core.autocrlf sur votre machine voir cette excellente réponse par @Daniel Jomphe
spankmaster79
1
Ce serait terriblement bien si git ne faisait simplement pas $% # avec l'un des fichiers archivés dans le référentiel. J'ai travaillé avec SLM, PerForce, MsBuild, Source Depot, TFS, SVM, aucun de ceux-ci ne changera ne serait-ce qu'un octet dans aucun de vos fichiers. Il s'agit d'un piratage insidieux IMO et cela m'a causé beaucoup de douleur.
Vance McCorkle
1
Ce qui se passe à la caisse n'est que la moitié de l'histoire - que se passe-t-il lors d'un get? Serait-il juste de dire qu'à la caisse, les fins de ligne restent inchangées LF, même sur les fenêtres?
Anthony
8

Cette configuration concerne la manière dont les fins de ligne sont gérées. Lorsqu'elle est activée, toutes les fins de ligne sont converties en LF dans le référentiel. Il existe d'autres indicateurs pour gérer la façon dont les fins de ligne sont converties dans votre répertoire de travail. Informations complètes sur le problème ici: https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

Karl Zöller
la source