Git и pbxproj
Я смотрел на приложение Mac с открытым исходным кодом, и они дали некоторые рекомендуемые значения для.gitignore. Они были тем, чего я ожидал...
Тем не менее, они также предложили запись в файл.gitattributes:
*.pbxproj -crlf -diff -merge
Я не самый знающий с точки зрения git, поэтому мне было интересно - каковы преимущества добавления этой строки? Что конкретно делает? Я видел это только в одном проекте, и если бы это была обычная практика, я бы ожидал увидеть это в другом месте прямо сейчас. Поэтому мне было интересно узнать, как это относится к файлу pbxproj.
4 ответа
Файл pbxproj на самом деле не подходит для человеческого объединения. Хотя это простой текст ASCII, это форма JSON. По сути, вы хотите рассматривать его как двоичный файл.
Вот что делают отдельные флаги:
-crlf: не использовать преобразование crlf <=> cr
-diff: не дифференцировать файл
-merge: не пытаться объединить файл
Из книги Pro Git Скотта Чакона
Некоторые файлы выглядят как текстовые файлы, но в целом они должны рассматриваться как двоичные данные. Например, проекты Xcode на Mac содержат файл, который заканчивается на.pbxproj, который в основном представляет собой набор данных JSON (простой текстовый формат данных javascript), записанный на диск IDE, в котором записаны ваши параметры сборки и так далее. Хотя технически это текстовый файл, потому что это все ASCII, вы не хотите относиться к нему как к такому, потому что это действительно легкая база данных - вы не можете объединить содержимое, если его поменяли два человека, и различия вообще не полезны. Файл предназначен для использования машиной. По сути, вы хотите рассматривать его как двоичный файл.
Различия часто полезны во время фиксации, чтобы проверить, что было изменено. Поэтому я считаю полезным сохранить способность рассеивания, но просто предотвратить слияние. Поэтому я использую это в моем файле.gitattributes:
*.pbxproj -crlf -merge
С другой стороны, кто-нибудь пробовал использовать merge=union для файлов pbxproj? Смотрите: Должен ли я объединять файлы.pbxproj с git используя merge=union?
Я столкнулся с проблемой коррупции *.pbxproj
файл после разрешения конфликтов слияния вручную. Или, чаще всего, мои файлы просто "исчезали" из рабочего дерева после слияния. Это сводило меня с ума, потому что мы работаем в команде, так что вы можете себе представить, как грязно это может стать очень быстро.
Итак, я проверил merge=union
и это хорошо работает до сих пор. Я знаю, что это не может помочь, если файлы были удалены или переименованы в одно и то же время, но для добавления новых файлов это работает как ожидалось: нет конфликтов, и файлы не исчезают после слияния. И это также экономит немало времени.
Если вы хотите попробовать, вот что я сделал.
1) Создайте глобальный файл.gitattributes. Запустите в терминале:
touch ~/.gitattributes
git config --global core.attributesfile ~/.gitattributes
2) Эта команда должна открыть его в текстовом редакторе:
open ~/.gitattributes
3) Когда файл откроется, добавьте эту строку и сохраните файл:
*.pbxproj binary merge=union
Готово. Надеюсь, что это поможет новым читателям, как это помогло мне.
Я написал скрипт Python под названием xUnique, чтобы решить эту проблему конфликтов слияния.
Этот скрипт делает следующие вещи:
- заменить все 24 символа
UUID
проектировать уникальные 32-символьные дайджесты MD5 и удалять любые неиспользуемые идентификаторы UUID (обычно вызванные неосторожным слиянием до этого). Это предотвратит дублирование UUID, потому что разные машины /Xcode генерируют разные UUID в этом файле. XCode распознает это, и проект может быть открыт. Во время этого процесса удалите все недопустимые строки в файле проекта - Сортировка файла проекта. Я написал Python-версию sort-Xcode-project-file от команды Webkit с большим количеством новых функций:
- поддержка сортировки
PBXFileReference
а такжеPBXBuildFile
разделы - удалить дубликаты файлов / ссылок
- избегайте создания нового файла, даже если без изменений, это делает меньше коммитов после использования этого скрипта
- поддержка сортировки
Более подробную информацию и обновления xUnique, пожалуйста, обратитесь к README