Wpadłem dzisiaj na ten numer. W moim przypadku problem polegał na tym, że mój edytor tekstu (Visual Studio) dodawał do każdego pliku, który dotknął, Unicode BOM. Tymczasem serwer Perforce został skonfigurowany tak, aby usuwał BOM Unicode z każdego pliku, zapobiegając wyświetlaniu BOM Unicode w Perforce. To ostatecznie spowodowało mój git p4 submit
się niepowodzeniem z następującym komunikatem:
error: patch failed: path/to/file.csproj:1
error: path/to/file.csproj: patch does not apply
rozwiązanie końcowa
dodałem następującą definicję filtru w moim ~/.gitconfig pliku:
[filter "utf8-autobom"]
clean = sed -b -e '1!b' -e 's/^\\xEF\\xBB\\xBF//'
smudge = sed -b -e '1!b' -e 's/\\(^\\|^\\xEF\\xBB\\xBF\\)/\\xEF\\xBB\\xBF/'
Potem zastosował filtr utf8-autobom
do plików naruszających prawa, dodając następujący wiersz w .gitattributes:
*.csproj filter=utf8-autobom
Potem zmusił Git, aby zastosować filtr do swojego indeksu z:
rm .git/index
git reset
Potem popełnił edytowanych plików Git i złożyłem zobowiązać się siłą rzeczy jak zwykle:
git add .
git commit --amend
git p4 submit
Sposób działania
Definicja filtra jest oparta na następujących poleceniach sed
, gdzie "abc" jest miejscem Uchwyt do odpowiedniej sekwencji bajtów BOM Unicode:
# Remove 'abc' from beginning of file, if present
sed -b -e '1!b' -e 's/^abc//'
# Add 'abc' to beginning of file, if not present
sed -b -e '1!b' -e 's/\(^\|^abc\)/abc/'
Na UTF-8 BOM używamy sekwencja bajtów EF BB BF
zamiast "abc."
Filtr usuwa zestawienie komponentów po zatwierdzeniu, wykonując komendę clean
i dodaje zestawienie komponentów podczas realizacji transakcji, wykonując komendę smudge
.Zachowuje to BOM w plikach drzewa roboczego, ale uniemożliwia zatwierdzenie BOM do Git lub przekazanie do Perforce.
(Patrz gitattributes documentation Szczegółowe informacje na temat clean
i smudge
.)
diagnozowania problemu
Myślałem, że komunikat był interesujący:
error: patch failed: path/to/file.csproj:1
error: path/to/file.csproj: patch does not apply
Mówi łatka zawiodły w linii 1, nawet jeśli moje zatwierdzenie nie zmieniło wiersza 1 pliku.
Aby zobaczyć, co się dzieje, uruchomiłem git diff p4/master HEAD
. Różnica wykazała, że moje zatwierdzenie dodawało dziwną postać <U+FEFF>
na początku pliku. Podejrzewałem, że jest to związane z kodowaniem plików, więc użyłem Notepad ++, aby otworzyć plik w moim drzewie roboczym Git. Następnie otworzyłem odpowiedni plik w obszarze roboczym Perforce. Notepad ++ pokazał kodowanie jako "UTF-8-BOM" w moim drzewie roboczym Git i "UTF-8" w moim obszarze roboczym Perforce. (użytkownicy systemu Linux i Cygwin: użyj komendy file <path-to-file>
aby wyświetlić informacje na temat kodowania plików.)
Googling "UTF-8 BOM" dostał mnie na właściwą drogę.
Uwaga
Niektóre operacje Git będą wolniejsze po zainstalowaniu tego filtra.
Tip
można usunąć część smudge
filtra jeśli nie potrzebujemy LM w drzewie roboczego. Przyspieszy to niektóre operacje Git (np. git checkout
). Po usunięciu linii smudge
definicja filtra to:
[filter "utf8-autobom"]
clean = sed -b -e '1!b' -e 's/^\\xEF\\xBB\\xBF//'
Czy któryś z nich działa dla Ciebie? http://stackoverflow.com/questions/9042865/git-p4-submit-fails-with-patch-does-not-apply http://stackoverflow.com/questions/15953609/git-p4-submit-fails – Philip