2013-03-20 4 views
5

В последнее время у меня проблемы с использованием git-p4.git p4 submit: исправление не применяется

Мой текущий рабочий процесс:

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 

Не всегда, но иногда при выполнении git p4 submit, изменения фактически не применяются, а вместо этого я вижу:

error: some_file.extension: patch does not apply 

Выполнение некоторых исследований, я имею попытался сделать жесткий сброс на мастер и снова слить без флага --no-ff, но это, похоже, не помогает.

Любые идеи приветствуются.

+0

Было ли это выполнено? http://stackoverflow.com/questions/9042865/git-p4-submit-fails-with-patch-does-not-apply http://stackoverflow.com/questions/15953609/git-p4-submit-fails – Philip

ответ

4

У меня была такая же проблема, и я думаю, что основной причиной было окончание строки. Вы можете попробовать запустить такие вещи, как dos2unix, чтобы исправить это, или установить этот конфиг:

git config --global core.autocrlf true 

Иногда, режимы файлов могут вызвать проблемы с. Этот конфиг может исправить (если вам не нравятся режимы файлов):

git config core.filemode false 
6

Я столкнулся с этим вопросом сегодня. В моем случае проблема заключалась в том, что мой текстовый редактор (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//'