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.
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é:
S'il vous plaît, jetez un oeil à cette capture d'écran:
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
.
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.
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
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 !]