Git и pbxproj

Я смотрел приложение с открытым исходным кодом Mac, и они предложили некоторые предлагаемые значения для .gitignore. Они были тем, что я ожидал бы...

Однако они также предложили запись в файл .gitattributes:

*.pbxproj -crlf -diff -merge

Я не самый узнаваемый в терминах git, поэтому мне было интересно - что именно преимущества добавления этой строки? Что конкретно происходит? Я только видел это в этом одном проекте, и если бы это была нормальная практика, я бы ожидал увидеть ее где-то в другом месте прямо сейчас. Поэтому мне было интересно узнать, как это относится к файлу pbxproj.

Ответ 1

Файл pbxproj на самом деле не сменяется человеком. Хотя это простой текст ASCII, это форма JSON. По сути, вы хотите рассматривать его как двоичный файл.

Вот что делают отдельные флаги:

-crlf: не используйте crlf <= > cr conversion

-diff: не отделяйте файл

-merge: не пытайтесь объединить файл

Из Pro Git книга Скотта Чакона

Некоторые файлы выглядят как текстовые файлы, но для всех целей и целей должны быть рассматриваются как двоичные данные. Например, Проекты Xcode на Mac содержат файл, который заканчивается на .pbxproj, который в основном JSON (обычный текст формат данных javascript) набор данных записанный на диск с помощью IDE, который записывает ваши настройки сборки и т.д. Хотя его технически текстовый файл, потому что его все ASCII, вы не хотите рассматривать его как таковую, поскольку его действительно легкая база данных - вы не может слить содержимое, если два человека изменил его, и он обычно отличается от arent полезно. Файл должен быть потребляемой машиной. По сути, вы хотите обрабатывать его как двоичный файл.

Ответ 2

Разница часто используется во время фиксации, чтобы проверить, что было изменено. Поэтому я считаю полезным сохранять разные способности, но просто предотвращать слияние. Поэтому я использую это в файле .gitattributes:

*.pbxproj -crlf -merge

В другом примечании, кто-нибудь пытался использовать merge = union для файлов pbxproj? См.: Должен ли я объединять файлы .pbxproj с помощью git с помощью merge = union?

Ответ 3

Я написал python script с именем xUnique для решения этой проблемы с конфликтом слияния.

Этот script выполняет следующие действия:

  • замените все 24 символа UUID на уникальные 32-значные MD5-дайджесты всего проекта и удалите все неиспользуемые UUID (обычно вызванные небрежным слиянием раньше). Это предотвратит дублирование UUID, потому что разные машины /Xcode генерируют разные UUID в этом файле. Xcode распознает его, и проект может быть открыт. Во время этого процесса удалите все недопустимые строки в файле проекта
  • Сортировка файла проекта. Я написал версию python sort-Xcode-project файл из команды Webkit с новыми функциями:
    • поддержка сортировки PBXFileReference и PBXBuildFile разделов
    • удалить дублированные файлы/ссылки
    • избегать создания нового файла, даже если никаких изменений не было сделано, это делает меньше коммитов после использования этого script

Подробнее и обновления xUnique см. README

Ответ 4

Я столкнулся с проблемой файла коррупции *.pbxproj после разрешения конфликтов слияния вручную. Или, чаще всего, мои файлы просто "исчезли" из рабочего дерева после слияния. Это сводило меня с ума, потому что мы работаем в команде, так что вы можете себе представить, насколько беспорядочно это может стать очень быстрым.

Итак, я проверил merge=union и он работает до сих пор. Я знаю, что это не поможет, если файлы были удалены или переименованы в одно и то же время, но для добавления новых файлов он работает так, как ожидалось: конфликтов нет, и файлы не исчезают после слияния. И это также экономит немало времени.

Если вы хотите попробовать, вот что я сделал.

1) Создайте глобальный файл.gitattributes. Запуск в терминале:

touch ~/.gitattributes
git config --global core.attributesfile ~/.gitattributes

2) Эта команда должна открыть его в текстовом редакторе:

open ~/.gitattributes

3) Когда файл открывается, добавьте эту строку и сохраните файл:

*.pbxproj binary merge=union

Готово. Надеюсь, это поможет новым читателям, как это помогло мне.