web-dev-qa-db-fra.com

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

Le fichier .gitattributes Contient généralement * text=auto. Quel est le but de text=auto Dans ce fichier?

117
Fizer Khan

Cela 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 lignes sont normalisées à LF à l'enregistrement).

Si vous souhaitez interagir avec un système de gestion de code source qui applique la normalisation de fin de ligne ou si vous souhaitez simplement que tous les fichiers texte de votre référentiel soient normalisés, vous devez 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.

61
Dave Zych

De les docs :

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

pattern attr1 attr2 ...

Donc, ici, le motif est *, qui signifie tous les fichiers, et l’attribut est text=auto.

Qu'est-ce que text=auto faire? 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 lignes sont normalisées à LF à l'enregistrement).

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.

Qu'est-ce que core.autocrlf faire? De la docs:

   core.autocrlf

Définir cette variable sur "true" revient presque à définir l'attribut text sur "auto" sur tous les fichiers, à l'exception du fait 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 que les fins de ligne CRLF se trouvent 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 est clair comme de la boue, vous n'êtes pas seul.

Voici ce que * text=auto fait dans mes mots: quand quelqu'un commet 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 CR + LF octets sont remplacés par LF octets. Cela n'affecte pas directement l'apparence des fichiers dans l'arborescence de travail, d'autres paramètres sont utilisés pour convertir = LF octets en CR + LF octets lors de l'extraction d'un fichier.

Recommandation:

Je voudrais pas recommande de mettre * text=auto dans le .gitattributes fichier. Au lieu de cela, je recommanderais quelque chose comme ceci:

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

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

Si vous devez utiliser * text=auto, mettez-le comme première ligne de .gitattributes, de sorte que les dernières lignes puissent le remplacer. Cela semble devenir une pratique de plus en plus populaire.

60
Flimm

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

7
Karl Zöller