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
Готово. Надеюсь, это поможет новым читателям, как это помогло мне.