Файл проекта Xcode git слияние конфликта
В Xcode, какой лучший способ избежать конфликта Git в файле проекта? (Я нахожусь в руководстве git, не используя интерфейс Xcode для git)
Я клонировал mapbox-ios-sdk из Github, взломал его, и теперь удаленный мастер изменился. Когда я пытался вытащить удаленные изменения в свои локальные, после слияния в файле проекта возникнет конфликт слиянием. (В частности, я имею в виду project.pbxproj в .xcodeproj)
Я действительно не думаю, что файл проекта должен быть помещен в игнор, так как если есть какие-либо новые файлы в файле проекта, файл .pbxproj, похоже, будет изменен. (Или я просто ошибаюсь, и этот файл следует игнорировать? Но, очевидно, он не был проигнорирован в mapbox-ios-sdk для начала. Людям нужен файл проекта в конце концов.) Но я также побежал в этот конфликт, прежде чем в моем проекте сотрудничества с другим сотрудником, и это не позволяет мне полностью использовать Git.
Должен ли я выяснить, как вручную разрешить конфликт или есть ли лучший способ справиться с этим?
Ответы
Ответ 1
.pbxproj изменится при добавлении новых файлов в проект. Будут конфликты, если два или более соавторов будут добавлять файлы одновременно (без взаимных изменений). Мы избегаем этого в моем проекте, выполнив следующие шаги до и после добавления новых файлов:
- Прежде чем добавлять файл, зафиксируйте свои изменения, а затем вытащите его из мастера, чтобы у вас был последний. Если кто-то добавил файл, теперь у вас есть последний .pbxproj
- Добавьте свои файлы.
- Немедленно зафиксируйте и надавите свои изменения до мастера (надеюсь, перед тем, как другой соавтор добавит еще один файл).
Это wimpy, но мы не любим вручную разрешать конфликты .pbxproj.
Также см. этот вопрос с переполнением стека с отличными ответами: Как правильно использовать Git с XCode?
Ответ 2
Многие сайты просто предлагают использовать файл .gitattributes с:
*.pbxproj merge=union
Мы попробуем этот подход, прежде чем пытаться использовать сценарии. Если мы обнаружим какие-либо проблемы, я обязательно обновлю этот пост. Также, если у кого-то есть комментарии к этому подходу, пожалуйста, включите.
Ответ 3
Вы должны проверить мой script xUnique, теперь это лучшее решение для слияния файла проекта Xcode, прежде чем Apple предпримет действия на него.
Что он делает и как это работает
- конвертировать
project.pbxproj
в формат JSON
- Итерировать все
objects
в JSON и дать каждому UUID абсолютный путь и создать новый UUID с использованием MD5 hex digest пути
- Все элементы в этом объекте json фактически связаны как дерево
- Мы указываем атрибут пути для каждого node дерева, используя его уникальный атрибут; этот путь является абсолютным путем к корню node,
- Примените MD5 hex digest к пути для node
- Замените все старые UUID на MD5 hex digest, а также удалите неиспользуемые UUID, которые не находятся в текущем дереве node и UUID в неправильном формате
- Отсортируйте файл проекта, введя
children
, files
, PBXFileReference
и PBXBuildFile
список и удалите все дублированные записи в этих списках
- см.
sort_pbxproj
метод в xUnique.py, если вы хотите знать реализацию;
- Он портирован из моего измененного
sort-Xcode-project-file
с некоторыми отличиями в упорядочении PBXFileReference
и PBXBuildFile
- С помощью разных опций вы можете использовать xUnique с большей гибкостью.
Подробнее о файле README.
Ответ 4
Если это вызвано добавлением файлов из двух или более коллаборационистов/ветвей (что по моему опыту всегда имело место на сегодняшний день и может быть проверено, посмотрев на diff), я делаю это:
- Решите конфликт, используя "использовать наши" или "используйте их" (в зависимости от того, что добавило большинство файлов).
- Commit (это создает репо, содержащее все добавленные файлы, но некоторые из них не входят в проект).
- Внутри Xcode используйте "Добавить файлы в...", чтобы добавить недостающие файлы из другого соавтора/ветки (их легко найти, поскольку они находятся в каталоге проекта, а Xcode полезно выделяет их для вас).
- Commit.
(Я не уверен, что шаг 2 действительно необходим, но мне кажется, что он мне не подходит).
Ответ 5
В большинстве случаев вы можете исправить слияние следующим кодом, удалите строки, которые git добавляет:
#!/bin/bash
FILE={PRODUCT_NAME}.xcodeproj/project.pbxproj
sed '/======/d' $FILE | sed '/<<<<</d' | sed '/>>>>>/d' > temp
cat temp > $FILE
rm temp
но если вы переименуете группу своего проекта и это приведет к конфликтам, вы вручную удалите лишние строки исходной группы.
Ответ 6
Вы также можете использовать Mergepbx вручную сделать это следующим образом
-
Установите Mergepbx, используя brew.
brew install mergepbx
-
Запускайте команду каждый раз, когда у вас возникают конфликты в файле проекта, чтобы автоматически разрешать их.
git mergetool --tool = mergepbx PROJECT.pbxproj
Ответ 7
Я сделал приложение для исправления вещей в файлах проекта Xcode, когда такие вещи идут не так, как надо. К сожалению, вам все равно придется сначала выполнить слияние вручную, к сожалению. https://itunes.apple.com/us/app/xsaviour/id1449886415?mt=12