2015-05-11 4 views
2

Я пытаюсь использовать git-p4 под Cygwin. «Клон» и «rebase» части рабочего процесса, похоже, работают правильно, но я не могу «отправить». Я предполагаю, что это может иметь какое-то отношение к соглашению о кончине. Я просмотрел this git-p4 issue и связанные с ним элементы, но манипуляции с конфигурацией строк и пробелов пока не увенчались успехом. Пункты примечания в моей конфигурации:Git P4 под Cygwin: Отправить не удается «Патч не применяется»

(1) Я использую Баш функцию оболочки трюк, чтобы получить пути для правильной работы:

$ type p4 
p4 is a function 
p4() 
{ 
    P4=`which p4`; 
    PWD=$(cygpath -wa .) "${P4}" "[email protected]" 
} 

(2) Я пробовал все настройки autocrlf значения GIT в - результатом является отказ независимо от (true, false, input). В настоящее время попытка «ложного», поскольку это имеет наибольший смысл при сравнении с депо.

(3) Я также играл с параметрами линии p4 clientspec; в настоящее время пытается «unix», b/c Cygwin и сервер песочницы P4, работающий под OSX.

Тест прост. Репо содержит один файл, foo1. Версия депо выглядит (выход с помощью od -c):

0000000 f o o 1 \n \n 
0000006 

локально-ГИТ-зафиксированной версия выглядит следующим образом:

0000000 f o o 1  i s  t h e  o n e ! 
0000020 \n \n 
0000022 

Я добавил некоторый дополнительный диагностический вывод метод applyCommit() в git- p4. Это в сочетании с запуском submit --verbose:

$ git p4 submit --verbose 
Reading pipe: git name-rev HEAD 
Reading pipe: ['git', 'config', 'git-p4.allowSubmit'] 
Reading pipe: git rev-parse --symbolic --remotes 
Reading pipe: git rev-parse p4/master 
Reading pipe: git cat-file commit ce414288d1b5d52dbad20c1a29f1875cfff7c281 
Reading pipe: git cat-file commit HEAD~0 
Reading pipe: git cat-file commit HEAD~1 
Reading pipe: ['git', 'config', 'git-p4.conflict'] 
Origin branch is remotes/p4/master 
Reading pipe: ['git', 'config', '--bool', 'git-p4.useclientspec'] 
Opening pipe: ['p4', '-G', 'where', '//depot/foo/...'] 
Perforce checkout for depot path //depot/foo/ located at c:\git\foo\ 
Synchronizing p4 checkout... 
... - file(s) up-to-date. 
Opening pipe: p4 -G opened ... 
Reading pipe: ['git', 'rev-list', '--no-merges', 'remotes/p4/master..master'] 
Reading pipe: ['git', 'config', '--bool', 'git-p4.skipUserNameCheck'] 
Reading pipe: ['git', 'config', 'git-p4.detectRenames'] 
Reading pipe: ['git', 'config', 'git-p4.detectCopies'] 
Reading pipe: ['git', 'config', '--bool', 'git-p4.detectCopiesHarder'] 
Reading pipe: ['git', 'show', '-s', '--format=format:%h %s', '2303176ae8c575313616ae2c4a35358258742598'] 
Applying 2303176 updating foo1 
Opening pipe: p4 -G users 
Reading pipe: ['git', 'log', '--max-count=1', '--format=%ae', '2303176ae8c575313616ae2c4a35358258742598'] 
Reading pipe: git diff-tree -r "2303176ae8c575313616ae2c4a35358258742598^" "2303176ae8c575313616ae2c4a35358258742598" 
//depot/foo/foo1#1 - opened for edit 
Sanity: git diff-tree --full-index -p "2303176ae8c575313616ae2c4a35358258742598" | git apply --verbose --check - 
Checking patch foo1... 
error: while searching for: 
foo1 


error: patch failed: foo1:1 
error: foo1: patch does not apply 
Unfortunately applying the change failed! 
Reading pipe: ['git', 'config', '--bool', 'git-p4.attemptRCSCleanup'] 
//depot/foo/foo1#1 - was edit, reverted 

Обратите внимание на диагностическую линию «Sanity:». Это значение tryPatchCmd, которое выходит из строя в методе applyCommit(). Если я выполнить первую часть заявления в командной строке Баша, я вижу:

2303176ae8c575313616ae2c4a35358258742598 
diff --git a/foo1 b/foo1 
index 630baf44b0874b3319c2814399f0b03106912183..4c23e4512b3347ec31068e464b64cbd99851cc9a 100644 
--- a/foo1 
+++ b/foo1 
@@ -1,2 +1,2 @@ 
-foo1 
+foo1 is the one! 

Трубопроводов это ко второй части результатов команды в отсутствии ошибки. Я недоумеваю, почему команда не выполняется при выполнении с использованием os.system() в сценарии Python, но в противном случае она преуспевает. Мысли?

ответ

2

Я считаю, что я решил это. Проблема была в два раза. Первый кардинальный грех - не внимательно прочитайте руководство. В documentation in the Submit section состоянии:

Отправка изменения из репозитория Git обратно в хранилище p4 требует отдельного клиент p4 рабочего пространства. Это должно быть указано с помощью переменной среды P4CLIENT или Git-p4.client для конфигурации Git. Клиент p4 должен существовать, но корень клиента будет создан и заполнен, если он еще не существует.

Потребовалось некоторое время, чтобы получить это через мою голову, что это на самом деле означало два физические рабочие копии - один для мерзавца, один для p4. Сценарий git-p4 захлебывался, пытаясь выполнить операции git и p4 в одной и той же папке, и такие операции на месте не очень хорошо смотрятся с моделью проверки Perforce. Я обнаружил это, выполнив тот же тестовый рабочий процесс на Mac, который с ошибкой [более четко] с «не может записывать файл clobber». Покрутив «clobber» в p4 clientpec, я смог получить представление в Mac и Cygwin для работы, и это поставило меня на правильный след.

Существует подробное руководство по созданию структуры двойного рабочего пространства по адресу this Perforce page.

Во-вторых: интересно, по-прежнему кажется, что требуется --ignore-whitespace как часть логики git apply в среде Cygwin. Это git-p4 хак, с которым я готов жить.