2013-03-20 9 views
5

Ostatnio miałem problemy z używaniem git-p4.git p4 submit: łata nie dotyczy

Mój obecny pracy jest:

git checkout -b some_feature 
# do some work and commit to some_feature branch 
git checkout master 
git merge --no-ff some_feature 
git p4 rebase 
git p4 submit 

Nie zawsze, ale czasami podczas wykonywania git p4 submit, zmiany w rzeczywistości nie stosuje i zamiast widzę:

error: some_file.extension: patch does not apply 

Wykonanie pewnych badań, mam próbowałem wykonać twardy reset na wzorcu i scalić ponownie bez flagi --no-ff, ale to nie pomaga.

Wszelkie pomysły są bardzo cenne.

+0

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

Odpowiedz

4

Miałem ten sam problem i myślę, że główną przyczyną były zakończenia linii. Można spróbować uruchomić rzeczy jak dos2unix go naprawić, lub ustawić config:

git config --global core.autocrlf true 

Czasami tryby plików może powodować problemy. Ta konfiguracja może go naprawić (jeśli nie zależy Ci na trybach plików):

git config core.filemode false 
6

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//'