J'ai été mordu par le problème de fin de ligne Windows / Linux avec git. Il semble, via GitHub, MSysGit et d'autres sources, que la meilleure solution est d'avoir votre dépôt local défini pour utiliser des fins de ligne de style linux, mais défini core.autocrlf
sur true
. Malheureusement, je ne l'ai pas fait assez tôt, donc à chaque fois que je tire des changements, les fins de ligne sont bouchées.
Je pensais avoir trouvé une réponse ici, mais je ne peux pas le faire fonctionner pour moi. Ma connaissance de la ligne de commande Linux est au mieux limitée, donc je ne suis même pas sûr de ce que fait la ligne "xargs fromdos" dans son script. Je reçois toujours des messages à propos de l'absence d'un tel fichier ou répertoire, et lorsque je parviens à le pointer vers un répertoire existant, il me dit que je n'ai pas d'autorisations.
J'ai essayé cela avec MSysGit sous Windows et via le terminal Mac OS X.
la source
Réponses:
La documentation git pour gitattributes documente désormais une autre approche pour «réparer» ou normaliser toutes les fins de ligne dans votre projet. Voici l'essentiel:
Cela s'appuie sur un nouveau
--renormalize
drapeau ajouté dans git v2.16.0, publié en janvier 2018. Pour les anciennes versions de git, il y a quelques étapes supplémentaires:la source
git reset
, s'il vous plaît?git status
est d'exécutergit diff --ignore-space-at-eol
juste pour être sûr que les seules modifications que vous effectuez sont les fins de ligne.git reset
ne détectera aucune modification et est donc inutile.--renormalize
drapeau ajouté dans v2.16.0 git qui a été publié en Janvier 2018. Le--renormalize
drapeau consolide le processus de fin de ligne re-traitement pour chaque fichier en tracked une seule commande:git add --renormalize .
.Le moyen le plus simple de résoudre ce problème consiste à effectuer un commit qui corrige toutes les fins de ligne. En supposant que vous n'avez aucun fichier modifié, vous pouvez procéder comme suit.
la source
Ma procédure pour gérer les fins de ligne est la suivante (combat testé sur de nombreux repos):
Lors de la création d'un nouveau référentiel:
.gitattributes
dans le tout premier commit avec d'autres fichiers typiques comme.gitignore
etREADME.md
Lorsqu'il s'agit d'un référentiel existant:
.gitattributes
conséquencegit commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n
(--no-verify
consiste à ignorer les hooks de pré-validation)alias fixCRLF="..."
Dans
.gitattributes
Je déclare tous les fichiers texte explicitement comme ayant LF EOL car généralement les outils Windows sont compatibles avec LF tandis que les outils non-Windows ne sont pas compatibles avec CRLF (même de nombreux outils de ligne de commande nodejs supposent LF et peuvent donc changer l'EOL dans vos fichiers).Contenu de
.gitattributes
Mon
.gitattributes
ressemble généralement à:Pour savoir quelles extensions distinctes sont suivies par git dans le référentiel actuel, regardez ici
Problèmes après normalisation
Une fois cela fait, il y a une mise en garde plus commune cependant.
Dites que votre
master
est déjà à jour et normalisé, puis vous passez à la caisseoutdated-branch
. Très souvent juste après avoir vérifié cette branche, git marque de nombreux fichiers comme modifiés.La solution est de faire un faux commit (
git add -A . && git commit -m 'fake commit'
) puisgit rebase master
. Après le rebase, le faux commit devrait disparaître.la source
2.7.0.windows.1
, j'ai utilisé ce qui suit:git rm --cached -r . && git reset --hard && git add . && git commit -m "Normalize EOL" -n
Explication:
git status --short
Cela affiche chaque ligne dont git est et n'est pas au courant. Les fichiers qui ne sont pas sous contrôle git sont marqués au début de la ligne par un «?». Les fichiers modifiés sont marqués d'un M.
grep "^ *M"
Cela ne filtre que les fichiers qui ont été modifiés.
awk '{print $2}'
Cela montre uniquement le nom de fichier sans aucun marqueur.
xargs fromdos
Cela prend les noms de fichiers de la commande précédente et les exécute via l'utilitaire «fromdos» pour convertir les fins de ligne.
la source
dos2unix
plutôt quefromdos
.Voici comment j'ai corrigé toutes les fins de ligne dans tout l'historique à l'aide de
git filter-branch
. Le^M
caractère doit être saisi avecCTRL-V
+CTRL-M
. J'ai utilisédos2unix
pour convertir les fichiers car cela ignore automatiquement les fichiers binaires.la source
Le "| xargs fromdos" lit à partir de l'entrée standard (le fichier
find
trouve) et l'utilise comme arguments pour la commandefromdos
, qui convertit les fins de ligne. (Fromdos est-il standard dans ces environnements? J'ai l'habitude de dos2unix). Notez que vous pouvez éviter d'utiliser xargs (particulièrement utile si vous avez suffisamment de fichiers que la liste d'arguments est trop longue pour xargs):ou
Je ne suis pas totalement sûr de vos messages d'erreur. J'ai testé cette méthode avec succès. Quel programme produit chacun? Pour quels fichiers / répertoires n'avez-vous pas d'autorisations? Cependant, voici un essai pour deviner ce que cela pourrait être:
Un moyen simple d'obtenir une erreur de fichier introuvable pour le script est d'utiliser un chemin relatif - utilisez un chemin absolu. De même, vous pourriez obtenir une erreur d'autorisation si vous n'avez pas rendu votre script exécutable (chmod + x).
Ajoutez des commentaires et je vais essayer de vous aider!
la source
ok ... sous cygwin, nous n'avons pas de fromdos facilement disponible, et cet awk substeb vous explose si vous avez des espaces dans les chemins d'accès aux fichiers modifiés (que nous avions), donc j'ai dû le faire un peu différemment:
bravo à @lloyd pour l'essentiel de cette solution
la source
Suivez ces étapes si aucune des autres réponses ne vous convient:
git config --global core.autocrlf true
; si vous êtes sous Unix, faitesgit config core.autocrlf input
git rm --cached -r .
.gitattributes
git add -A
git reset --hard
Ensuite, votre section locale devrait être propre maintenant.
la source
.gitattributes
fichier est la solution au problème de fin de ligne?