Force LF en fin de vie dans le repo git et de la copie de travail

j'ai un dépôt git hébergé sur github. Beaucoup de fichiers ont d'abord été développés sur Windows, et je n'ai pas été trop prudent sur les fins de ligne. Lorsque j'ai effectué la propagation initiale, je n'avais pas non plus de configuration git pour forcer les fins de ligne correctes. Le résultat est que j'ai un certain nombre de fichiers avec les fins de ligne CRLF dans mon dépôt github.

je me développe maintenant partiellement sur Linux, et j'aimerais nettoyer les fins de ligne. Comment s'assurer de la les fichiers sont stockés correctement avec LF sur github, et ont LF dans ma copie de travail?

j'ai créé un fichier .gitattributes contenant text eol=LF ; est-ce exact? Avec ça engagé et poussé, puis-je juste rm mon repo local et re-cloner de github pour obtenir l'effet désiré?

120
demandé sur Chowlett 2012-04-02 17:02:15

3 réponses

sans un peu d'information sur ce que les fichiers sont dans votre dépôt (code source pur, images, exécutables, ...), il est un peu difficile de répondre à la question :)

à côté de cela, je considérerai que vous êtes prêt à utiliser par défaut LF comme fin de ligne dans votre répertoire de travail parce que vous êtes prêt à vous assurer que les fichiers texte ont des fins de ligne LF dans votre .Git repository que vous travailliez sous Windows ou Linux. En effet, mieux vaut prévenir que guérir....

cependant, il y a une meilleure alternative: profitez des fins de ligne LF dans votre workdir Linux, des fins de ligne CRLF dans votre workdir Windows et des fins de ligne LF dans votre dépôt.

comme vous travaillez partiellement sur Linux et Windows, assurez-vous que core.eol est défini à native et core.autocrlf est défini à true .

ensuite, remplacer le contenu de votre fichier .gitattributes par le suivant

* text=auto

cela permettra à Git de gérer la conversion automagic line endings pour vous, sur commits et checkouts. 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 dépôt, vous pouvez donner un coup de main à Git et l'aider à détecter des 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 par la

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

cela assurera que les fichiers dont l'extension est c, h, ou txt seront stockés avec les fins de ligne LF dans votre repo et auront des fins de ligne natives dans le répertoire de travail. Les fichiers Jpeg ne seront pas touchés. Tous les autres bénéficieront du même filtrage automatique comme vu ci-dessus.

afin d'obtenir une meilleure compréhension des détails intérieurs de tout cela, je vous suggère de plonger dans ce très bon post "l'Esprit de la fin de votre ligne" de Tim Clem, un Githubber.

comme un exemple du monde réel, vous pouvez également jeter un coup d'oeil à ce commit où ces changements à un fichier .gitattributes sont démontrés.

mise à JOUR de la réponse en considérant le commentaire suivant

en fait, je ne veux pas de CRLF dans Mes répertoires Windows, parce que mon environnement Linux est en fait une VirtualBox partageant le répertoire Windows

a du sens. Merci pour la clarification. Dans ce contexte précis, le fichier .gitattributes ne suffira pas.

exécutez les commandes suivantes contre votre dépôt

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

comme votre dépôt est partagé entre votre Linux et L'environnement Windows, cela mettra à jour le fichier de configuration local pour les deux environnements. core.eol veillera à ce que les fichiers texte affichent les fins des lignes LF sur les checkouts. core.autocrlf assurera que potential CRLF dans les fichiers texte (résultant d'une opération de copie/coller par exemple) sera converti en LF dans votre dépôt.

optionnellement, vous pouvez aider Git à distinguer ce que est un fichier texte en créant un fichier .gitattributes contenant quelque chose de similaire à ce qui suit:

# 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", 1519390920" commettre .

enfin, s'assurer que git status mentionne "rien à commettre (nettoyage du répertoire de travail) " , puis effectuer l'opération suivante

$ git checkout-index --force --all

cela va recréer vos fichiers dans votre répertoire de travail, en tenant compte de vos modifications de configuration et le fichier .gitattributes et de remplacer tout CRLF potentiel négligé dans vos fichiers texte.

une fois que cela est fait, chaque fichier texte dans votre répertoire de travail portera les terminaisons de la ligne LF et git status devrait toujours considérer le workdir comme propre.

183
répondu nulltoken 2016-03-13 10:11:48

, à Partir de git 2.10, il n'est pas nécessaire d'énumérer chaque fichier texte séparément. Git 2.10 fixe le comportement de text = auto avec eol=lf . Source .

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

* text=auto eol=lf

Ajouter et valider.

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

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 .

48
répondu koppor 2017-05-23 11:54:47

pour forcer les fins de ligne LF pour tous les fichiers texte, vous pouvez créer .gitattributes fichier au niveau supérieur de votre dépôt avec les lignes suivantes (changer comme désiré):

# 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 des terminaisons de ligne normalisées ( LF ) dans le dépôt (normalement les contrôles de configuration core.eol que vous avez par défaut).

basé sur le nouveaux paramètres d'attribut, tout fichier texte contenant des CRLF doit être normalisé par Git. Si cela ne se produit pas automatiquement, vous pouvez rafraîchir un dépôt manuellement après avoir changé les fins de ligne, de sorte que vous pouvez re-scanner et propager le répertoire de travail par les étapes suivantes (À partir d'un 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 par GitHub docs :

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 de ne pas être traité comme un texte, désactiver leur attribut texte, par exemple

manual.pdf      -text

ou le marquer 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é, cochez .gitattributes at Drupal core :

# 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 aussi:

21
répondu kenorb 2017-12-07 11:47:51