web-dev-qa-db-fra.com

Git Shell sous Windows: le codage de caractères par défaut du correctif est UCS-2 Little Endian - comment changer cela en ANSI ou en UTF-8 sans BOM?

Lorsque vous créez un correctif diff avec Git Shell sous Windows (lorsque vous utilisez GitHub pour Windows ), le codage de caractèresdu correctif sera UCS-2 Little Endian selon Notepad ++ (voir les captures d'écran ci-dessous).

Comment puis-je changer ce comportement et forcer git à créer des correctifs avec ANSI ou UTF-8 sans codage de caractères dans la nomenclature?

Cela pose un problème car les patchs encodés UCS-2 Little Endian ne peuvent pas être appliqués, je dois le convertir manuellement en ANSI. Si je ne le fais pas, je reçois"fatal: entrée non reconnue"error.

 Creating git patch

 Notepad++ screenshot of the character encoding


Depuis lors, j'ai aussi réalisé que je devais convertir manuellement le format EOL du format Windows (\r\n) en UNIX (\n) dans Notepad ++ (Édition> Conversion EOL> UNIX). Si je ne le fais pas, j'obtiens l'erreur "espaces de fin" (même si tous les espaces sont coupés: "TextFX"> "Édition TextFX"> "Découper les espaces de fin").

Donc, les étapes que je dois faire pour que le correctif soit appliqué:

  1. créer un patch ( voici le résultat )
  2. convertit le codage de caractères en ANSI
  3. Conversion EOL au format UNIX
  4. appliquer le patch

S'il vous plaît, jetez un oeil à cette capture d'écran:

 Applying a patch in Windows Powershell with Git is problematic

36
Sk8erPeter

Je ne suis pas un utilisateur Windows, alors prenez ma réponse avec un grain de sel. Selon le Windows PowerShell Cookbook , PowerShell pré-traite le résultat de git diff en le divisant en lignes. La documentation de Out-File Cmdlet suggère que > est identique à | Out-File sans paramètres. Nous trouvons également ce commentaire dans la documentation PowerShell :

Les résultats de l'utilisation de la cmdlet Out-File peuvent ne pas correspondre à vos attentes si vous êtes habitué à la redirection de sortie traditionnelle. Pour comprendre son comportement, vous devez connaître le contexte dans lequel la cmdlet Out-File fonctionne.

Par défaut, la cmdlet Out-File crée un fichier Unicode. C'est le meilleur choix par défaut à long terme, mais cela signifie que les outils qui attendent des fichiers ASCII ne fonctionneront pas correctement avec le format de sortie par défaut. Vous pouvez modifier le format de sortie par défaut en ASCII à l'aide du paramètre Encoding:

[...]

Le contenu du fichier de formats hors fichier doit ressembler à la sortie de la console. Cela provoque la sortie de la sortie exactement comme dans une fenêtre de console dans la plupart des cas. [...]

Pour obtenir une sortie qui ne force pas les retours à la ligne à correspondre à la largeur de l'écran, vous pouvez utiliser le paramètre Width pour spécifier la largeur de la ligne.

Donc, apparemment, ce n’est pas Git qui choisit l’encodage des caractères, mais Out-File. Cela suggère a) que la redirection PowerShell ne devrait réellement être utilisée que pour du texte et b) que

| Out-File -encoding ASCII -Width 2147483647 my.patch

évitera les problèmes d'encodage. Cependant, cela ne résout toujours pas le problème des terminaisons de ligne Windows vs Unix. Des applets de commande (voir/ Extensions de communauté PowerShell ) permettent de convertir les fins de ligne.

Cependant, tout ce recodage n'augmente pas ma confiance en un patch (qui n'a pas de code lui-même, mais est juste une chaîne d'octets). Le susdit Cookbook contient un script Invoke-BinaryProcess, qui peut être utilisé pour rediriger la sortie d'une commande non modifiée.

Pour éviter tout ce problème, une autre solution consisterait à utiliser git format-patch au lieu de git diff. format-patch écrit directement dans un fichier (et non sur stdout), ainsi sa sortie n'est pas recodée. Cependant, il ne peut créer que des correctifs à partir de commits, pas de diffs arbitraires.

format-patch prend une plage de validation (par exemple master^10..master^5) ou une seule validation (par exemple X, signifiant X..HEAD) et crée des fichiers de correctif sous la forme NNNN-SUBJECT.patch, où NNNN est un nombre croissant à 4 chiffres et le sujet est ( mutilé) du patch. Un répertoire de sortie peut être spécifié avec -o.

18
Lars Noschinski

Si vous utilisez Powershell, vous pouvez aussi simplement faire:

cmd /c "git diff > patch.diff"

Cela rend la commande à exécuter via CMD qui écrit dans le fichier de sortie tel quel.

7
ddiukariev

Si cela peut aider quelqu'un, utiliser la bonne vieille invite de commandes au lieu de PowerShell fonctionne parfaitement. il ne semble pas souffrir d'aucun des problèmes présents dans PowerShell en ce qui concerne le codage des caractères et les EOL.

 enter image description here

3
Daniel Liuzzi
  1. Sortie Iconv des diffs
  2. Pour les patchs plain-7bit (anglais pur), vous pouvez ignorer la détection folle de Notepad ++: patch-content ne contient pas de définition de charset
1
Lazy Badger

Faire dos2unix sur le diff généré sur powershell semble faire l'affaire pour moi. J'ai alors pu apply le diff avec succès.

dos2unix.exe diff_file
git apply diff_file
1
Vish

Comme mentionné par Lars Noschinski, vous devez corriger la sortie de Out-File. Vous pouvez définir le paramètre par défaut de Out-File à l’aide des commandes suivantes.

$PSDefaultParameterValues['Out-File:Encoding'] = 'ASCII'
$PSDefaultParameterValues['Out-File:Width'] = '2147483647'

Après avoir défini les paramètres par défaut, vous pouvez utiliser le > pour exporter un fichier de correctif.

Après avoir ajouté ces deux lignes à mon fichier de profil, tout fonctionne comme prévu.

λ git stash show -p > test3
C:\Users\..\Source\.. [master +1 ~0 -0 !]
λ git apply test3
C:\Users\..\Source\.. [master +1 ~2 -0 !]
0
Console