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

Concurrency в репозитории GIT в общей сетевой папке

Я хочу иметь голый репозиторий git, хранящийся в общем сетевом ресурсе (Windows). Я использую linux и имею указанную сетевую долю, смонтированную с помощью CIFS. Мой coleague использует Windows XP, и сетевой сетевой автомат (из ActiveDirectory, как-то) в качестве сетевого диска.

Интересно, могу ли я использовать репо с обоих компьютеров без проблем concurrency.

Я уже тестировал, и на моем конце я могу клонировать нормально, но я боюсь того, что может произойти, если мы оба одновременно займемся одним и тем же репо (push/pull).

В git FAQ есть ссылка на использование сетевых файловых систем (и некоторые проблемы с SMBFS), но я не уверен, есть ли какая-либо блокировка файлов, выполняемая сетью/сервером/windows/linux - я ' m совершенно уверен, что нет.

Итак, кто-нибудь использовал репозиторий git на сетевом ресурсе без сервера и без проблем?

Спасибо,
Alex

PS: Я хочу избегать использования http-сервера (или git -daemon), потому что у меня нет доступа к серверу с общими. Кроме того, я знаю, что мы можем просто нажимать/тянуть друг от друга, но мы должны иметь код/​​репо на ресурсе по резервным причинам.

Обновление:

Мои заботы не о возможности сбоя сети. Тем не менее, у нас будут необходимые ветки локально, и мы сможем собрать наши источники.

Но мы обычно совершаем довольно часто и часто нуждаемся в пересоединении/слиянии. С моей точки зрения, лучшим вариантом было бы иметь центральное репо на общем ресурсе (поэтому резервные копии гарантированы), и мы оба будем клонировать с него и использовать его для rebase.

Но, из-за того, что мы делаем это часто, я боюсь за повреждение файла/репо, если это произойдет, мы оба одновременно нажимаем/вытягиваем. Обычно мы могли yell друг у друга каждый раз, когда мы обращаемся к удаленному репо:), но было бы лучше, если бы он был защищен компьютерами/сетью.

И возможно, что git имеет внутренний механизм для этого (поскольку кто-то может нажать на один из ваших репозиториев, пока вы работаете над ним), но я еще не нашел ничего убедительного.

Обновление 2:

Репо на диске общего доступа было бы репозиторией bare, не содержащим рабочей копии.

4b9b3361

Ответ 1

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

Другая часть базы данных объектов сложнее - ссылки сохраняются в файлах в каталоге "refs" (или в "упакованных refs" ), и они меняются: хотя файлы refs/* малы и всегда переписан, а не редактироваться. В этом случае Git записывает новый ref во временный файл ".lock", а затем переименовывает его поверх целевого файла. Если файловая система уважает семантику O_EXCL, это безопасно. Даже если это не так, худшее, что может случиться, - это раса, перезаписывающая файл ref. Хотя это было бы неприятно встречать, это не должно приводить к коррупции как таковой: возможно, это может быть случай, когда вы нажимаете на общее репо, и этот push выглядит так, как будто это удалось, тогда как на самом деле кто-то еще это сделал. Но это можно было бы отсортировать просто, потянув (слияние в другом коммите) и снова нажав.

В целом, я не думаю, что коррупция репо слишком большая проблема здесь - это правда, что все может пойти немного неправильно из-за проблем с блокировкой, но дизайн репо Git минимизирует повреждение.

(Отказ от ответственности: все это звучит хорошо в теории, но я не делал одновременного удара репо, чтобы проверить его, и делиться ими только через NFS, а не CIFS)

Ответ 2

Зачем беспокоиться? Git предназначен для распределения. Просто создайте репозиторий на каждой машине и используйте механизм публикации и вытягивания для распространения ваших изменений между ними.

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

Или создайте один репозиторий на общем ресурсе и сделайте свою работу от них, но используйте их как распределенные репозитории, из которых вы можете вытаскивать ревизии друг от друга. Если вы используете этот метод, производительность выполнения построений и т.д. Будет уменьшена, так как вы будете постоянно получать доступ к сети.

Или, распределите репозитории на своих компьютерах и запустите периодическую задачу, чтобы перенаправить ваши фиксации в хранилища на общем ресурсе.

Ответ 3

По-видимому, поддерживается центральный репозиторий git. Большинство предписанных применений указывают на доступ к ssh или http, ни один из которых не позволяет одновременный доступ к репо. Даже если вы используете полностью распределенное использование, этот вопрос возникает, если более двух соавторов нажимают на одно и то же репо. Пока ответ не ответил на этот вопрос. Является ли дизайн git разрешающим его N одновременным нажатием на ветвь?

Ответ 4

Звучит так же, как если бы вы хотели использовать централизованную систему управления версиями, поэтому запрос на резервное копирование будет удовлетворен. Возможно, с xxx2git между вами, чтобы вы могли работать локально.