Git хранилище файлов репозитория сервера - PullRequest
1 голос
/ 13 ноября 2011

В ближайшее время я буду работать над несколькими приложениями для iPhone / iPad и буду использовать Git в качестве моей системы контроля версий. В прошлых проектах (но не на iOS) я использовал SVN. Мое основное решение для перехода на Git - децентрализованная структура.

Я буду использовать удаленный сервер в качестве центрального репозитория Git (скорее всего, битбакет Atlassian). Я еще не настроил это, но в то же время я тестировал Git локально.

Я прочитал несколько ресурсов для начинающих и теперь довольно хорошо разбираюсь в основах, но есть одна вещь, которую мне нужно подтвердить, что я правильно понимаю.

В моем примере ниже я использую локальную версию Git на моем Mac.

Я создал локальный репозиторий git с именем git_test . В этом хранилище у меня есть два фиктивных файла с именами file1 и file2 . Я понимаю, что это мой рабочий каталог, который содержит мои настоящие файлы (а не BLOB-объекты).

Я также понимаю, что центральное хранилище на удаленном сервере должно быть пустым и не содержать фактических файлов рабочего каталога.

Предположим, что у меня есть два пользователя (Пользователь A и Пользователь B) с одинаковыми локальными репозиториями.

Пользователь A

  • Изменения file1
  • фиксирует file1
  • Выполняет отправку в удаленный репозиторий

Пользователь B

  • Изменения file2
  • фиксирует файл2
  • Выполняет отправку в удаленный репозиторий

Правильно ли я сказал, что новые BLOB-объекты загружены в каталог .git / objects в удаленном хранилище?

Затем, когда пользователь A и пользователь B выполняют команду pull в своих локальных системах, фактический файл, а не большой двоичный объект, обновляется содержимым нового большого двоичного объекта. Это правильно?

Извините за многословный вопрос. Я просто надеюсь, что все имеет смысл.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2011

Вам не нужно слишком беспокоиться о каплях внутри пустого хранилища. Что лучше понять, так это то, что каждый репозиторий состоит из объектов фиксации, которые содержат точную файловую структуру на момент фиксации в этом репозитории.

В вашем примере, пользователь A локально генерирует commitA, пользователь B локально генерирует commitB, оба они были основаны на master на голом репозитории, который бы указывал на объект commit (скажем) commitBase. Это означает, что у них обоих есть родительский элемент commitBase.

Когда A нажимает, он помещает свою commitA в пустой репозиторий, который перемещает указатель главной ветви вверх на commitA. Вся информация о файле1 находится внутри объекта коммита commitA (вместе с информацией об остальной структуре файла).

Прежде чем B отправит, он должен сначала внести изменения для commitA в свой репозиторий, потому что указатель удаленной главной ветки больше не указывает на commitBase. Он не может нажать, пока он не синхронизируется с удаленным на объектах фиксации и указателях ветвления. Таким образом, когда он получает объект commitA в свой репозиторий, он собирается получить fileA как часть этого, который появится в его файловой системе, если он выполнит извлечение или перебазирование, но получит только объект commit в свой репозиторий (не файл в его рабочий каталог), если он делает выборку. Fetch просто обновляет git с помощью новых объектов коммитов, не изменяя свой собственный указатель главной ветви. Именно в момент слияния / перебазирования git должен будет принять некоторые решения о файлах в рабочем каталоге, например, если обычные файлы легко объединяются, или новые файлы могут быть просто помещены на диск, или если они слишком большие. конфликт, и вам придется вручную разрешать конфликты в файлах.

В вашем простом примере у вас нет конфликта, поэтому вы должны либо перебазировать и сделать свой commitA ставшим commitA2 и иметь родителя для commitB, либо объединить и сохранить родительский объект вашего commitA как commitBase, но сгенерировать новый объект commitM, который будет результат слияния B и A.

То, как git внутренне представляет это в своей директории .git / objects в любом из 3 репозиториев, на данный момент не имеет значения. Возможно, он сжимает и перемещает содержимое, чтобы максимизировать базу данных всех этих объектов, как ему нравится, но это не то, о чем я когда-либо беспокоился, пытаясь понять, как работают объекты фиксации для файлов.

0 голосов
/ 13 ноября 2011

Когда вы нажимаете на удаленное репо, оно будет отрицать это, если ваше локальное репо отстает от удаленного репо

Не уверен, если это отвечает на ваш вопрос

Это гарантирует, что вы не пытаетесь изменить файл, который уже был изменен - ​​это заставляет вас извлекать новейшие изменения заранее

Также, когда вы извлекаете данные из локального репозитория, да, фактический файл изменяется - в репозитории git я считаю, что он создает новый diff-файл iirc, но я могу ошибаться, все, что я знаю, это то, что он фактически не перезаписывает файлы удаленно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...