Подтвердить что ты не робот

Файл проекта Xcode git слияние конфликта

В Xcode, какой лучший способ избежать конфликта Git в файле проекта? (Я нахожусь в руководстве git, не используя интерфейс Xcode для git)

Я клонировал mapbox-ios-sdk из Github, взломал его, и теперь удаленный мастер изменился. Когда я пытался вытащить удаленные изменения в свои локальные, после слияния в файле проекта возникнет конфликт слиянием. (В частности, я имею в виду project.pbxproj в .xcodeproj)

Я действительно не думаю, что файл проекта должен быть помещен в игнор, так как если есть какие-либо новые файлы в файле проекта, файл .pbxproj, похоже, будет изменен. (Или я просто ошибаюсь, и этот файл следует игнорировать? Но, очевидно, он не был проигнорирован в mapbox-ios-sdk для начала. Людям нужен файл проекта в конце концов.) Но я также побежал в этот конфликт, прежде чем в моем проекте сотрудничества с другим сотрудником, и это не позволяет мне полностью использовать Git.

Должен ли я выяснить, как вручную разрешить конфликт или есть ли лучший способ справиться с этим?

4b9b3361

Ответ 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 вручную сделать это следующим образом

  1. Установите Mergepbx, используя brew.

    brew install mergepbx

  2. Запускайте команду каждый раз, когда у вас возникают конфликты в файле проекта, чтобы автоматически разрешать их.

    git mergetool --tool = mergepbx PROJECT.pbxproj

Ответ 7

Я сделал приложение для исправления вещей в файлах проекта Xcode, когда такие вещи идут не так, как надо. К сожалению, вам все равно придется сначала выполнить слияние вручную, к сожалению. https://itunes.apple.com/us/app/xsaviour/id1449886415?mt=12