web-dev-qa-db-fra.com

Force LF eol dans le dépôt git et la copie de travail

J'ai un dépôt git hébergé sur github. La plupart des fichiers ont été initialement développés sous Windows et je ne faisais pas très attention aux fins de ligne. Lorsque j'ai effectué la validation initiale, je n'avais également aucune configuration git en place pour appliquer les fins de ligne correctes. Le résultat est que j'ai un certain nombre de fichiers avec des fins de ligne CRLF dans mon référentiel github.

Je développe maintenant partiellement Linux et j'aimerais nettoyer les fins de ligne. Comment puis-je m'assurer que les fichiers sont correctement stockés avec LF sur github et ont LF dans ma copie de travail?)?

J'ai mis en place un .gitattributes fichier contenant text eol=LF; Est-ce exact? Cela fait, puis-je simplement rm mon dépôt local et me re-cloner à partir de github pour obtenir l’effet souhaité?

149
Chowlett

Sans un peu d'informations sur les fichiers présents dans votre référentiel (code source pur, images, exécutables, ...), il est un peu difficile de répondre à la question :)

A côté de cela, je considérerai que vous êtes prêt à utiliser par défaut LF comme fins de ligne dans votre répertoire de travail car vous êtes prêt à vous assurer que les fichiers texte ont LF fins de lignes dans votre dépôt .git que vous travailliez sous Windows ou Linux. Mieux vaut prévenir que guérir ....

Cependant, il existe une meilleure alternative: profitez des fins de ligne LF dans votre répertoire de travail Linux, CRLF dans votre répertoire de travail Windows ET LF dans votre référentiel.

Comme vous travaillez partiellement sur Linux et Windows, assurez-vous que core.eol est réglé sur native et core.autocrlf est réglé sur true.

Ensuite, remplacez le contenu de votre .gitattributes fichier avec les éléments suivants

* text=auto

Cela permettra à Git de gérer la conversion des fins de ligne automagiques pour vous, lors des validations et des extractions. Les fichiers binaires ne seront pas modifiés, les fichiers détectés comme étant des fichiers texte verront les fins de ligne converties à la volée.

Cependant, comme vous connaissez le contenu de votre référentiel, vous pouvez donner un coup de main à Git et l’aider à détecter les fichiers texte à partir de fichiers binaires.

Si vous travaillez sur un projet de traitement d’image basé sur C, remplacez le contenu de votre .gitattributes fichier avec les éléments suivants

* text=auto
*.txt text
*.c text
*.h text
*.jpg binary

Cela garantira que les fichiers dont l’extension est c, h ou txt seront stockés avec LF fins de lignes dans votre référentiel et auront des fins de lignes natives dans le répertoire de travail. Les fichiers Jpeg ne seront pas Tous les autres bénéficieront du même filtrage automagique que celui présenté ci-dessus.

Afin de mieux comprendre les détails intérieurs de tout cela, je vous suggère de plonger dans ce très bon message "Attention à la fin de votre ligne" de Tim Clem, un Githubber.

En tant qu'exemple concret, vous pouvez également jeter un coup d'œil à ceci commit où ces modifications sont apportées à un .gitattributes fichier sont démontrés.

MISE À JOUR de la réponse en tenant compte du commentaire suivant

En fait, je ne veux pas de CRLF dans mes répertoires Windows, car mon environnement Linux est en fait une VirtualBox partageant le répertoire Windows

Logique. Merci pour la clarification. Dans ce contexte spécifique, le .gitattributes Le fichier en lui-même ne suffira pas.

Exécutez les commandes suivantes sur votre référentiel

$ git config core.eol lf
$ git config core.autocrlf input

Comme votre référentiel est partagé entre votre environnement Linux et Windows, le fichier de configuration local sera mis à jour pour les deux environnements. core.eol s'assurera que les fichiers texte portent LF fins de lignes lors du paiement. core.autocrlf s'assurera que potentiel CRLF dans les fichiers texte (résultant d'une opération de copier/coller, par exemple) sera converti en LF dans votre référentiel.

Vous pouvez éventuellement aider Git à distinguer ce que est un fichier texte en créant un .gitattributes fichier contenant quelque chose de similaire au suivant:

# Autodetect text files
* text=auto

# ...Unless the name matches the following
# overriding patterns

# Definitively text files 
*.txt text
*.c text
*.h text

# Ensure those won't be messed up with
*.jpg binary
*.data binary

Si vous avez décidé de créer un .gitattributes fichier, le commet .

Enfin, assurez-vous que git status mentionne "rien à commettre (répertoire de travail propre)", puis effectuez l'opération suivante

$ git checkout-index --force --all

Ceci recréera vos fichiers dans votre répertoire de travail, en tenant compte de vos modifications de configuration et du fichier .gitattributes fichier et le remplacement de tout fichier CRLF potentiellement négligé dans vos fichiers texte.

Ceci fait, tous les fichiers texte de votre répertoire de travail porteront LF fins de lignes et git status devrait toujours considérer le travail comme propre.

207
nulltoken

À partir de git 2.10, il n’est pas nécessaire d’énumérer chaque fichier texte séparément. Git 2.10 corrige le comportement de text = auto avec eol = lf . Source .

.gitattributes fichier dans la racine de votre dépôt git:

* text=auto eol=lf

Ajoutez et commettez-le.

Ensuite, vous pouvez suivre les étapes et tous les fichiers sont maintenant normalisés:

git rm --cached -r .  # Remove every file from git's index.
git reset --hard      # Rewrite git's index to pick up all the new line endings.

Source: Réponse de Kenorb .

89
koppor

Pour forcer LF fins de lignes pour tous les fichiers texte, vous pouvez créer .gitattributes fichier dans le niveau supérieur de votre référentiel avec les lignes suivantes (changez si vous le souhaitez):

# Ensure all C and PHP files use LF.
*.c         eol=lf
*.php       eol=lf

qui garantit que tous les fichiers que Git considère comme des fichiers texte ont une fin de ligne normalisée (LF) dans le référentiel (normalement core.eol contrôle de la configuration lequel vous avez par défaut).

Sur la base des nouveaux paramètres d'attribut, tout fichier texte contenant des CRLF devrait être normalisé par Git. Si cela ne se produit pas automatiquement, vous pouvez actualiser manuellement un référentiel après avoir modifié les fins de ligne. Vous pouvez ainsi réanalyser et valider le répertoire de travail en procédant comme suit (répertoire de travail propre):

$ echo "* text=auto" >> .gitattributes
$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

ou selon docs GitHub :

git add . -u
git commit -m "Saving files before refreshing line endings"
git rm --cached -r . # Remove every file from Git's index.
git reset --hard # Rewrite the Git index to pick up all the new line endings.
git add . # Add all your changed files back, and prepare them for a commit.
git commit -m "Normalize all the line endings" # Commit the changes to your repository.

Voir aussi: @ Charles Bailey post .

En outre, si vous souhaitez exclure des fichiers pour qu’ils ne soient pas traités comme un texte, supprimez leur attribut text, par exemple.

manual.pdf      -text

Ou marquez-le explicitement comme binaire:

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

Pour voir un fichier de normalisation git plus avancé, vérifiez .gitattributes à noyau Drupal :

# Drupal git normalization
# @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
# @see https://www.drupal.org/node/1542048

# Normally these settings would be done with macro attributes for improved
# readability and easier maintenance. However macros can only be defined at the
# repository root directory. Drupal avoids making any assumptions about where it
# is installed.

# Define text file attributes.
# - Treat them as text.
# - Ensure no CRLF line-endings, neither on checkout nor on checkin.
# - Detect whitespace errors.
#   - Exposed by default in `git diff --color` on the CLI.
#   - Validate with `git diff --check`.
#   - Deny applying with `git apply --whitespace=error-all`.
#   - Fix automatically with `git apply --whitespace=fix`.

*.config  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.css     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.dist    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.engine  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.html    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html
*.inc     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.js      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.json    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.lock    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.map     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.md      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.module  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.php     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.po      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.script  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.sh      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.sql     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.svg     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.theme   text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.twig    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.txt     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.xml     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.yml     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2

# Define binary file attributes.
# - Do not treat them as text.
# - Include binary diff in patches instead of "binary files differ."
*.eot     -text diff
*.exe     -text diff
*.gif     -text diff
*.gz      -text diff
*.ico     -text diff
*.jpeg    -text diff
*.jpg     -text diff
*.otf     -text diff
*.phar    -text diff
*.png     -text diff
*.svgz    -text diff
*.ttf     -text diff
*.woff    -text diff
*.woff2   -text diff

Voir également:

22
kenorb