Windows CRLF to Unix LF Issues in Vagrant

je travaille sur la fourniture de quelques VMs en utilisant Vagrant . Voici la situation:

Host : Windows 7 (64-bit)

Guest : Ubuntu 14.04 (64-bit)

j'ai du mal à faire passer les fins de la ligne CRLF à L'EPA. Cela provoque l'échec des scripts bash dans le dossier partagé dans la machine invitée (voir ci-dessous).

vagrant@vagrant-host:/vagrant/bin$ sudo bash build-ubuntu-14.04.1-c
make.sh
build-ubuntu-14.04.1-cmake.sh: line 5: $'r': command not found
build-ubuntu-14.04.1-cmake.sh: line 19: $'r': command not found
: invalid option04.1-cmake.sh: line 21: set: -
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
build-ubuntu-14.04.1-cmake.sh: line 22: $'r': command not found
build-ubuntu-14.04.1-cmake.sh: line 24: $'r': command not found
build-ubuntu-14.04.1-cmake.sh: line 26: $'r': command not found
build-ubuntu-14.04.1-cmake.sh: line 29: $'r': command not found
build-ubuntu-14.04.1-cmake.sh: line 36: $'r': command not found
build-ubuntu-14.04.1-cmake.sh: line 42: $'r': command not found
build-ubuntu-14.04.1-cmake.sh: line 46: $'r': command not found
build-ubuntu-14.04.1-cmake.sh: line 48: $'r': command not found
build-ubuntu-14.04.1-cmake.sh: line 50: $'r': command not found
build-ubuntu-14.04.1-cmake.sh: line 226: syntax error: unexpected end of file

dans mon fichier Vagrantfile j'ai placé le paramètre binary à false.

# Provision the VM
ubuntu.vm.provision "shell" do |s|
  # replace Windows line endings with Unix line endings
  s.binary = false

  s.inline = "sudo apt-get update;
              sudo bash vagrant/bin/build-ubuntu-14.04.1-cmake.sh"
end

selon la documentation du vagabond:

binary (booléen) - Vagrant remplace automatiquement les fins de ligne de Windows par des fins de ligne Unix. Si c'est vrai, Vagabond ne le fera pas. Par défaut c'est "faux". Si le fournisseur de shell communique sur WinRM, cela signifie par défaut "true".

Quel est le problème? Suis-je donnant sur quelque chose dans la documentation?


Maj 1 : J'ai essayé de modifier mes paramètres git locaux comme recommandé dans cette réponse de débordement de pile , mais pas de chance. Aussi, j'ai ajouté un .gitattributes fichier dans le répertoire racine du projet et ajouté ce qui suit à ce fichier:

# detect all text files and automatically normalize them (convert CRLF to LF)
*       text=auto

j'ai aussi lu plus de "Traiter avec des fins de ligne" document fourni par Git. Lorsque je m'engage dans mon dépôt, les CRLF sont convertis en LFs, mais lorsque je vérifie les modifications dans un espace de travail Windows, les LFs sont convertis en CRLF. C'est le comportement exact que je veux dans Mon flux Git. Le problème est avec Vagrant. Le drapeau binary que j'ai placé ne fonctionne pas de la façon décrite dans la documentation.


Maj 2 : Le changement de s.binary = true a réglé le problème. Toutefois, je pense que le libellé de la documentation devrait être réexaminé. La documentation indique que "si ceci [le drapeau] est vrai, alors Vagrant ne fera pas faire ceci [changer CRLF en LF]."D'après ce que j'ai compris, Vagrant va changer et non en LFs si cette option est activée. Toutefois, les CRLF sont remplacés par LFs si cela est vrai.

15
demandé sur Community 2015-02-22 00:00:36

2 réponses

vous avez raison, la documentation sur binary était trompeuse. J'ai proposé une demande et ceci a été corrigé sur la page de documentation.

donc maintenant il est écrit:

binary (booléen) - Vagrant remplace automatiquement les fins de ligne de Windows avec les fins de ligne Unix. si c'est false , alors Vagabond ne fera pas ce . Par défaut c'est false . Si le shell est provisioner la communication sur WinRM, la valeur par défaut est true .

pour remplacer les fins de ligne de Windows ( CRLF ) par les fins de ligne Unix ( LF ), vous devez définir:

s.binary = true

les solutions de rechange comprennent:

  • changer les fins de ligne manuellement par:

    • utilisant dos2unix commande,
    • utilisant ex commande, p.ex.

      ex +'bufdo! %! tr -d \r' -scxa *.sh
      
  • ajouter les lignes suivantes dans votre fichier Bashrc (par ex. ~/.bashrc ) gist :

    export SHELLOPTS
    set -o igncr
    

si vous utilisez Git pour versionner votre code, vous devriez:

  • Configurer Git sur OS X pour gérer correctement les fins de ligne en réglant core.autocrlf option input ou false .

    si vous avez installé Git sur Windows, l'erreur la plus courante est de sélectionner Checkout Windows-style option pendant l'installation, donc vous devriez le réinstaller et choisir l'une ou l'autre: Checkout AS-is et commit fin de ligne Unix-style ( core.autocrlf est réglé sur input ) ou passer à la Caisse, s'engager en tant qu'-est ( core.autocrlf est réglé sur false ).

  • envisager de créer un fichier de normalisation git dans votre dépôt ( .gitattributes ) qui garantit qu'aucune fin de ligne CRLF n'est en place, ni lors de la caisse ni lors de la vérification, par exemple:

    *.sh     text eol=lf
    

    donc les gens éditant votre script d'approvisionnement, ils ne cassera pas la fin de ligne.

  • Lire aussi: Traiter avec des fins de ligne sur GitHub Aider.

  • Related: '\r': commande not found - .bashrc / .bash_profile .
8
répondu kenorb 2017-08-28 02:34:20

comme indiqué ci-dessus dans ma mise à jour, la modification de s.binary = true a corrigé le problème. Toutefois, je pense que le libellé de la documentation devrait être réexaminé. La documentation indique que "si ceci [le drapeau] est vrai, alors Vagrant ne le fera pas [changer CRLF en LF]."Si je comprends bien, Vagrant ne changera pas CRLFs en LFs si cette option est activée. Toutefois, les CRLF sont remplacés par LFs si cela est vrai.

6
répondu Jonathan 2015-07-20 19:57:56