Śledzę plik maszyny wirtualnej Virtual PC (* .vmc) w git i po wprowadzeniu zmiany git zidentyfikował plik jako binarny i nie porównał go dla mnie. Odkryłem, że plik został zakodowany w UTF-16.
Czy można nauczyć git, aby rozpoznawał, że ten plik jest tekstowy i odpowiednio go obsługiwał?
Używam git pod Cygwin, z core.autocrlf ustawionym na false. W razie potrzeby mógłbym użyć mSysGit lub git pod UNIXem.
Istnieje bardzo proste rozwiązanie, które działa po wyjęciu z pudełka na Unices.
Na przykład z
.strings
plikami Apple po prostu:Utwórz
.gitattributes
plik w katalogu głównym repozytorium za pomocą:Dodaj do swojego
~/.gitconfig
pliku:Źródło: pliki Diff .strings w Git (i starszy post z 2010 r.).
źródło
iconv
jest „kolejnym narzędziem” w taki sam sposób jak Vim lub Beyond Compare (nie jest częścią pakietu git).vimdiff
iiconv
oba są już obecne na macOS, więc nie musisz się zastanawiać, skąd je zdobyć, i wykonują swoją pracęCzy próbowałeś ustawić
.gitattributes
traktowanie go jako pliku tekstowego?na przykład:
Więcej szczegółów na http://www.git-scm.com/docs/gitattributes.html .
źródło
set
idiff
...*.vmc diff
,*.sql diff
etc .. jest potrzebne, aby ustawić „diff” atrybut dla podanej ścieżce. (Nie mogę edytować odpowiedzi). Jednak dwa zastrzeżenia: różnice są wyświetlane z odstępami między znakami i nie można ich „wstawić na scenę” ani „odrzucić fragmentu” dla tych problematycznych plików.Domyślnie wygląda na to, że
git
nie będzie działać dobrze z UTF-16; dla takiego pliku musisz upewnić się, że nieCRLF
jest na nim wykonywane żadne przetwarzanie, ale chceszdiff
imerge
działać jak normalny plik tekstowy (to ignoruje, czy twój terminal / edytor obsługuje UTF-16, czy nie).Ale patrząc na stronę
.gitattributes
podręcznika , oto atrybut niestandardowy, który jestbinary
:Wydaje mi się więc, że możesz zdefiniować niestandardowy atrybut na swoim najwyższym poziomie
.gitattributes
dlautf16
(pamiętaj, że dodam tutaj scalanie, aby upewnić się, że jest traktowany jako tekst):Stamtąd możesz określić w dowolnym
.gitattributes
pliku coś takiego:Pamiętaj również, że nadal powinieneś być w stanie
diff
plik, nawet jeśli uważasz ,git
że jest binarny z:Edytować
Ta odpowiedź zasadniczo mówi, że różnica GNU z UTF-16 lub nawet UTF-8 nie działa zbyt dobrze. Jeśli chcesz
git
użyć innego narzędzia, aby zobaczyć różnice (przez--ext-diff
), ta odpowiedź sugeruje Guiffy .Ale to, czego prawdopodobnie potrzebujesz, to tylko
diff
plik UTF-16, który zawiera tylko znaki ASCII. Aby to zadziałało, użyj--ext-diff
i następującego skryptu powłoki:Zauważ, że konwersja do UTF-8 może działać również w przypadku scalania, musisz tylko upewnić się, że odbywa się to w obu kierunkach.
Jeśli chodzi o dane wyjściowe na terminal podczas przeglądania pliku różnicowego UTF-16:
GNU diff tak naprawdę nie dba o unicode, więc kiedy używasz diff --text, po prostu porównuje i wyświetla tekst. Problem polega na tym, że terminal, którego używasz, nie obsługuje emitowanego UTF-16 (w połączeniu ze znakami różnicowymi, które są znakami ASCII).
źródło
Rozwiązaniem jest przefiltrowanie
cmd.exe /c "type %1"
. Wbudowany program cmdtype
wykona konwersję, więc możesz go użyć ze zdolnością textconv git diff, aby włączyć tekstowe porównywanie plików UTF-16 (powinno działać również z UTF-8, chociaż nie zostało przetestowane).Cytowanie ze strony podręcznika gitattributes:
Wykonywanie różnic tekstowych plików binarnych
Czasami pożądane jest zobaczenie różnicy wersji przekonwertowanych na tekst niektórych plików binarnych. Na przykład dokument edytora tekstu można przekonwertować na reprezentację tekstową ASCII i różnicę wyświetlanego tekstu. Mimo że ta konwersja powoduje utratę niektórych informacji, wynikowa różnica jest przydatna do oglądania przez ludzi (ale nie można jej zastosować bezpośrednio).
Opcja textconv config służy do zdefiniowania programu do wykonania takiej konwersji. Program powinien pobrać pojedynczy argument, nazwę pliku do konwersji i wygenerować wynikowy tekst na standardowe wyjście.
Na przykład, aby wyświetlić różnice w informacjach exif pliku zamiast informacji binarnych (zakładając, że masz zainstalowane narzędzie exif), dodaj następującą sekcję do
$GIT_DIR/config
pliku (lub$HOME/.gitconfig
pliku):Rozwiązanie dla mingw32 , fani cygwin mogą wymagać zmiany podejścia. Problem polega na przekazaniu nazwy pliku do konwersji do cmd.exe - będzie on używał ukośników, a cmd zakłada separatory katalogów z ukośnikiem odwrotnym.
Krok 1:
Utwórz skrypt z jednym argumentem, który dokona konwersji na standardowe wyjście. c: \ ścieżka \ do \ jakiś \ skrypt.sh:
Krok 2:
Skonfiguruj git, aby móc używać pliku skryptu. Wewnątrz git config (
~/.gitconfig
lub.git/config
lub zobaczyćman git-config
), umieścić w tym:Krok 3:
Wskaż pliki, do których należy zastosować to obejście, wykorzystując pliki .gitattributes (zobacz man gitattributes (5)):
następnie użyj
git diff
na swoich plikach.źródło
cmd //c type "${1//\//\\}"
.textconv = powershell -NoProfile -Command \"& {Get-Content \\$args[0]}\"
git zaczął ostatnio rozumieć kodowanie, takie jak utf16. Zobacz dokumentację gitattributes , wyszukaj
working-tree-encoding
[Upewnij się, że Twoja strona podręcznika pasuje, ponieważ jest to całkiem nowe!]
Jeśli (powiedzmy) plik jest w formacie UTF-16 bez BOM na komputerze z systemem Windows, dodaj go do swojego
.gitattributes
plikuJeśli UTF-16 (z bom) na * nix to:
(Wymień
*.vmc
się*.whatever
dlawhatever
plików typu trzeba uchwytem)Zobacz: Obsługa kodowania drzewa roboczego „UTF-16LE-BOM” .
Dodano później
Po @Hackslash można stwierdzić, że to nie wystarczy
Aby uzyskać ładne różnice tekstowe, potrzebujesz
Umieszczenie obu działa również
Ale to prawdopodobnie
eol=...
implikujetext
Problem
Git ma atrybut makro,
binary
który oznacza-text -diff
. Odwrotność+text +diff
nie jest dostępna jako wbudowana, ale git daje narzędzia (chyba!) Do syntezyRozwiązanie
Git pozwala zdefiniować nowe atrybuty makr.
Zaproponowałbym ten szczyt
.gitattributes
pliku, który maszNastępnie dla wszystkich ścieżek, które muszą być tekstowe i różnicowe
Zauważ, że w większości przypadków chcielibyśmy domyślnego kodowania (utf-8) i domyślnego eol (natywnego), więc mogą zostać odrzucone.
Większość linii powinna wyglądać
Dlaczego po prostu nie użyć diff?
Praktyczne: w większości przypadków potrzebujemy natywnego eol. Co oznacza nie
eol=...
. Więctext
nie będzie dorozumiany i musi być wyraźnie określony.Koncepcyjne: binarny tekst Vs jest podstawowym rozróżnieniem. eol, kodowanie, różnicowanie itp. to tylko niektóre aspekty tego.
Zrzeczenie się
Ze względu na dziwne czasy, w których żyjemy, nie mam maszyny z działającym dupkiem. Dlatego w tej chwili nie mogę sprawdzić najnowszego dodatku. Jeśli ktoś znajdzie coś nie tak, poprawię / usunę.
źródło
*.vmc diff working-tree-encoding=UTF-16LE-BOM eol=CRLF
text
sam, że nie dostałeś ładnych różnic tekstowych? Czy możesz to sprawdzić z obydwomatext
idiff
wszystko działa dobrze? W takim razie przedstawię inną rekomendacjętext
samo wyniki w porównaniu binarnym. Mogę zrobićdiff
lubtext diff
i to działa. Musiałem dodać-BOM
tylko dlatego, że mój plik miał BOM, YMMV.Napisałem mały sterownik git-diff
to-utf8
, który powinien ułatwić porównywanie plików zakodowanych w formacie innym niż ASCII / UTF-8. Możesz go zainstalować, korzystając z instrukcji tutaj: https://github.com/chaitanyagupta/gitutils#to-utf8 (to-utf8
skrypt jest dostępny w tym samym repozytorium).Zauważ, że ten skrypt wymaga , aby w systemie były dostępne obie komendy
file
iiconv
.źródło
Niedawno wystąpił ten problem w systemie Windows, a pojemniki
dos2unix
iunix2dos
dostarczane z git dla systemu Windows załatwiły sprawę. Domyślnie znajdują się wC:\Program Files\Git\usr\bin\
. Zauważ, że zadziała to tylko wtedy, gdy twój plik nie musi być w formacie UTF-16. Na przykład ktoś przypadkowo zakodował plik Pythona jako UTF-16, gdy nie było to konieczne (w moim przypadku).i
źródło