Convertir tous les fichiers du dépôt pour utiliser une fin de ligne Unix
ZerooCool opened this issue · 24 comments
Convertir tous les fichiers du dépôt pour utiliser une fin de ligne Unix.
1- Indenter tous les fichiers en PSR-2 à l'aide du script Php-codeSniffer.
Lire le wiki : https://github.com/ZerooCool/phpsecinfo/wiki/Configurer-le-d%C3%A9p%C3%B4t-pour-la-collaboration-Unix-et-Windows
2- Repasser le dépôt local en fin de ligne Unix depuis Eclipse.
https://wiki.visionduweb.fr/index.php?title=Utiliser_Git_avec_Eclipse#Utiliser_un_type_de_fin_de_ligne_diff.C3.A9rent_pour_un_projet_Git_sp.C3.A9cifique
3- Ajouter la configuration core.autocrlf input pour Git sur Linux.
Réglage spécifique pour Git sous Linux
(Fins de ligne CRLF sous Windows mais LF sous Mac et Linux et dans le dépôt.)
Régler la valeur du paramètre à input :
git config --global core.autocrlf input
Réglage spécifique pour Git sous Windows
core.autocrlf=true
# Vérifier
# core.safecrlf=true
4- Ajouter la configuration pour paramétrer le référentiel avec .gitattributes
Les paramètres à ajouter pour un projet Web : https://gitattributes.io/api/web
Récapitulatif :
https://wiki.visionduweb.fr/index.php?title=Utiliser_Git_avec_Eclipse#Param.C3.A9trer_un_r.C3.A9f.C3.A9rentiel_Git
Depuis Eclipse :
Je tente de définir la fin de ligne en cliquant sur le fichier, source, nettoyer, fin de ligne Unix
phpsecinfo/20070406-phpsecinfo-v0.2.1/PhpSecInfo/Test/Core (phpsecinfo-zeroocool-v0.2.1) $
file upload_tmp_dir.php
upload_tmp_dir.php: PHP script, ASCII text, with CRLF, LF line terminators
J'arrive a définir la fin de ligne depuis le menu Fichier, convertir les délimiteurs de ligne, Unix
phpsecinfo/20070406-phpsecinfo-v0.2.1/PhpSecInfo/Test/Core (phpsecinfo-zeroocool-v0.2.1) $
file upload_tmp_dir.php
upload_tmp_dir.php: PHP script, ASCII text
Je retrouve le format identique aux autres fichiers que je n'ai pas encore modifié.
PHP script, ASCII text
L'encodage affiché est ASCII.
Un fichier utilisant des caractères ASCII ordinaires ne peut pas être distingué d'un fichier UTF-8.
La conversion ne fonctionnera pas sur un fichier ne contenant pas de caractères accentués.
Je ne retrouve pas les informations sur la fin de ligne Unix, en ligne de commande.
1- Indenter les fichiers avec Php-codeSniffer depuis la racine du projet.
phpcbf --standard=PSR2 *
2- Depuis Eclipse s'assurer de la configuration générale et du projet en fin de ligne Unix.
3- Pour Git sur Linux, ajouter la configuration core.autocrlf input
git config --global core.autocrlf input
4- Ajouter .gitattributes au niveau du dossier .git
git add --renormalize .
git commit -m "git add --renormalize ."
git push origin phpsecinfo-zeroocool-v0.2.1
Tous les fichiers qui, à tort, ont été archivés avec des fins de ligne de style Windows seront désormais "renormalisés" pour avoir des fins de ligne de style Unix.
Le projet est maintenant à jour sur le dépôt Git.
Il est cloné sur le serveur de production et fonctionne.
Revérifier les quatres étapes pour la méthodologie.
OK.
Cloner le projet vers Windows pour tester les fins de ligne en local.
Pousser une modification depuis Windows pour voir si le dépôt conserve les fins de ligne Unix.
Le dépôt depuis Windows est fonctionnel par défaut.
Il n'ajoute pas la fin de ligne Windows lors d'un commit push.
J'aurais du créer un nouveau fichier directement et ne pas me limiter à une modification de contenu dans un fichier. Je crée un nouveau fichier depuis Windows, pour intégrer le test version.php ajouté par bigdeej : https://github.com/bigdeej/PhpSecInfo/blob/master/PhpSecInfo/Test/Core/version.php
Le fichier est créé depuis Windows.
Une fois poussé sur le dépôt Github, le symbole de fin de ligne Windows apparait dans l'historique des modifications du fichier.
Le dépôt n'est pas propre !
J'installe Git manuellement sur Windows et je renseigne les options de caractères de fin de ligne attendues lors de l'installation : Caractère de fin de ligne Windows en local mais Unix sur le dépôt.
La création de ce fichier depuis Eclipse sous Windows, une fois commit et push sur le dépôt Github, n'entraîne pas de caractère de fin de ligne Windows, depuis l'historique du fichier.
Dernière étape, vérifier que ce n'est pas le copier coller du fichier version.php qui a entrainé le retour de fin de ligne Windows dans le dépôt.
Je modifie le fichier test_fin_de_ligne.php et je crée un nouveau fichier test_copier_coller.php avec le code copier depuis https://github.com/bigdeej/PhpSecInfo/blob/master/PhpSecInfo/Test/Core/version.php
Le copier coller intègre un message dans le dépôt à la fin du fichier : No newline at the end of file.
C'est ce message que je cherche à faire disparaître. La solution, à la fin de cette issue !
Remplacer * text=auto par * text=auto eol=lf dans le fichier .gitattributes
Modifier la configuration globale de Git sur Windows :
git config --global core.eol lf
Test pour actualiser les commandes précédentes ?
cd ~/Documents/GitHub/phpsecinfo (phpsecinfo-zeroocool-v0.2.1)
git rm -rf --cached .
git reset --hard HEAD
Ne fonctionne toujours pas pour un copier coller normal qui voit la ligne Windows être ajoutée dans le dépôt distant sur Github.
Depuis Git sur Windows.
cd c:/Users/Utilisateur/Documents/GitHub/phpsecinfo
git add --renormalize
git status
git commit -m "Normalize all the line endings"
Ne change rien.
Depuis Windows pour un cas particulier.
Si on ne veut pas de CRLF dans ses répertoires Windows, car l'environnement Linux serrait sur une VirtualBox partageant le répertoire Windows.
Le fichier .gitattributes ne suffira pas.
git config core.eol lf
git config core.autocrlf input
Ce n'est pas la situation ici.
git checkout-index --force --all
Va recréer les fichiers dans votre répertoire de travail, en prenant en compte vos modifications de configuration et le fichier .gitattributes et en remplaçant tout CRLF potentiellement négligé dans vos fichiers texte.
La commande précédente ne change rien à la fin de ligne déjà existante dans le fichier Test Copier Coller en l'état.
Modifier la ligne suivante pour PHP dans le fichier .gitattributes
*.php text eol=lf
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.
Vous ne pouvez pas utiliser text=auto et eol ensemble. Définir eol désactive la détection automatique des fichiers texte. C'est pourquoi vous devez spécifier tous ces types de fichiers. Si l' auto était activée, vous n'auriez pas besoin de tout cela.
En fait, j'ai le même problème avec Linux quand je copie colle le code original depuis :
https://github.com/bigdeej/PhpSecInfo/blob/master/PhpSecInfo/Test/Core/version.php
Une ligne CRLF est ajoutée dans le dépôt si je ne fait pas une entrée manuellement.
J'ai tenté de supprimer la ligne ajoutée manuellement pour voir si le retour charriot apparaissait depuis le dépôt Github, et, c'est le cas.
Je rétablis cette ligne, et, je format le code depuis Eclipse.
Suite au dépôt la fin de ligne semble avoir enfin disparue du dépôt Github.
Je n'arrive pas à trouver pourquoi la configuration automatique ne nettoie pas ce code, d'autant plus que la source du code copié ne semble pas contenir ce retour charriot Windows.
C'est peut être du à l'éditeur utilisé, ici, Eclipse.
Un copier coller dans Eclipse entraînerait cet ajout de fin de ligne ?
Quoi qu'il en soit, depuis Eclipse :
- Un fichier vide créé fonctionnera automatiquement avec la bonne fin de ligne.
- Un fichier collé même nettoyé n'aura pas forcément la bonne fin de ligne.
Nettoyer le code puis le formater ne suffit pas sous Linux ni sous Windows depuis Eclipse.
Le premier dépôt aura une fin de ligne Windows.
Etrange, suite à la deuxième modification du fichier, dans son contenu, le fichier sera alors affiché sans fin de ligne Windows depuis l'historique de Github.
Pour nettoyer un code qui a été copié collé
Depuis Eclipse sous Linux :
Utiliser la méthode déjà définie dans le wiki, avec le script PhpCodeSniffer.
Depuis Eclipse sous Windows :
- Un fichier vide créé fonctionnera automatiquement avec la bonne fin de ligne.
- Un fichier nettoyé ne semble pas fonctionner.
Pour un copier coller qui doit fonctionner du premier coup, sans fin de ligne Windows, il semble que passer par un filtre formulaire pourrait être une bonne idée.
# Afficher les fichiers qui ne sont pas encore commit.
git status
# Ajouter les fichiers actuels dans le référentiel Git de sorte que le travail ne soit pas perdu.
git add . -u
git commit -m "Sauvegarder vos modifications en cours"
# Supprimer tous les fichiers versionnés dans git
git rm -r --cached .
# C'est avec cette commande que git va changer toutes les EOF avec ce que l'on a spécifié dans le .gitattributes :
# Les caractères -- correspondent à la branche courante.
git checkout -- .
# Réinitialiser l'index local et sur le dépôt. ### Vérifier si cette commande est indispensable.
# git reset --hard
# Ajouter tous les fichiers modifiés en normalisant les fins de ligne.
git add --renormalize .
# Ajouter les modifications dans le référentiel.
git commit -m "git add --renormalize ."
# Tous les fichiers qui, à tort, ont été archivés avec des fins de ligne de style Windows seront désormais "renormalisés" pour avoir des fins de ligne de style Unix.
J'ai le symbole suivant dans l'historique de Github après la création d'un fichier php commit push :
No newline at the end of file
--> Le fichier d'origine n'avait aucun caractère de nouvelle ligne à la fin du fichier.
Laisser une ligne blanche à la fin de chaque fichier.
C'est une bonne méthode que de toujours mettre une nouvelle ligne blanche en dernier caractère si le format de fichier le permet.
De plus, pour les fichiers d'en-tête C et C ++, cette méthode est requise par le standard de langage.
Si la ligne blanche à la fin du fichier est absente, on peut voir qu'en affichant deux fois le même fichier avec cat, le deuxième affichage sera ajoutée à la "ligne" finale du premier affichage si elle ne se termine pas par une nouvelle ligne. Le code sera donc affiché bout à bout et, dans certains cas, cela pourra générer une erreur de script quand ils sont inclus dans un fichier.
Test d'indentation avec le script PSR-2 python, depuis le terminal Linux.
En fait, le script Python depuis le terminal Linux ajoute une ligne vide de lui même !
Cela explique pourquoi ce script permet de faire disparaître les messages de fin de ligne depuis l'historique de Github : No newline at the end of file
On se retrouve donc dans le contexte suivant :
Chaque fichier doit avoir une ligne vide, simplement avec la touche entrée, qu'il soit créé depuis Linux ou Windows ! Ainsi, qu'il soit édité directement ou avec du contenu par copier coller, ajouter une fin de ligne vide permet, en plus d'être une bonne pratique, de ne pas avoir le caractère rouge en fin de fichier depuis Github : No newline at the end of file.
Résolu !