Я столкнулся с этим вопросом сегодня. В моем случае проблема заключалась в том, что мой текстовый редактор (Visual Studio) добавлял Unicode BOM к каждому файлу, к которому он прикасался. Тем временем сервер Perforce был настроен для разметки спецификации Unicode из каждого файла, что препятствовало появлению спецификации Unicode в Perforce. Это в конечном счете вызвало мое git p4 submit
потерпеть неудачу со следующим сообщением:
error: patch failed: path/to/file.csproj:1
error: path/to/file.csproj: patch does not apply
Окончательное решение
Я добавил следующее определение фильтра в моем ~/.gitconfig файла:
[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/'
Тогда я применил фильтр utf8-autobom
к оскорбительным файлам, добавив следующую строку в .gitattributes:
*.csproj filter=utf8-autobom
Тогда я вынужден Git, чтобы применить фильтр к индексу с:
rm .git/index
git reset
Затем я совершил отредактированные файлы в Git и представил мое обязательство Perforce как обычно:
git add .
git commit --amend
git p4 submit
Как это работает
Определение фильтра основано на следующих командах sed
, где «abc» - это место Держатель для соответствующей последовательности байтов Unicode BOM:
# 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/'
Для UTF-8 BOM, мы используем последовательность байт EF BB BF
вместо "ABC".
Фильтр удаляет спецификацию на фиксацию, запустив команду clean
, и добавляет спецификацию на проверку, запустив команду smudge
.Это сохраняет спецификацию в файлах рабочего дерева, но препятствует тому, чтобы спецификация была передана Git или передана Perforce.
(См gitattributes documentation подробную информацию о clean
и smudge
.)
Диагностирование проблемы
Я думал, сообщение об ошибке было интересно:
error: patch failed: path/to/file.csproj:1
error: path/to/file.csproj: patch does not apply
Он сказал, что патч не удалось в строке 1, хотя моя команда не редактировала строку 1 файла.
Чтобы посмотреть, что происходит, я запустил git diff p4/master HEAD
. Разница показала, что моя фиксация добавляла в начале файла странный символ <U+FEFF>
. Я подозревал, что это связано с кодировкой файлов, поэтому я использовал Notepad ++ для открытия файла в рабочем дереве Git. Затем я открыл соответствующий файл в рабочей области Perforce. Notepad ++ показал кодировку как «UTF-8-BOM» в моем рабочем дереве Git и «UTF-8» в моей рабочей области Perforce. (Linux и Cygwin пользователи: используйте команду file <path-to-file>
для отображения информации о кодировании файлов.)
погуглить "UTF-8 BOM" меня на правильный путь.
Примечание
Некоторые операции Git будет медленнее с этим фильтром установлен.
Совет
Вы можете удалить smudge
часть фильтра, если не нужен BOM в рабочем дереве. Это ускорит некоторые операции Git (например, git checkout
). При удалении линии smudge
определение фильтра:
[filter "utf8-autobom"]
clean = sed -b -e '1!b' -e 's/^\\xEF\\xBB\\xBF//'
Было ли это выполнено? http://stackoverflow.com/questions/9042865/git-p4-submit-fails-with-patch-does-not-apply http://stackoverflow.com/questions/15953609/git-p4-submit-fails – Philip