Копирует ли создание ветки Git ВСЕ исходный код? - PullRequest
0 голосов
/ 21 октября 2019

Так, например, вы работаете @ Google в команде YouTube и хотите изменить внешний вид панели поиска, или просто хотите изменить размер шрифта, или работаете над крупным проектом, таким как система рекомендаций, и т. Д. ли ветка Git скопировать ВСЕ код бэкенда для YouTube на вашем компьютере? Так что, если в команде YouTube работают 100 инженеров со своих ноутбуков, есть ли в продаже 100 копий кода YouTube на их крошечных ноутбуках? Потому что, как я понимаю, Git, когда вы переходите, вы создаете копию исходного кода, которую вы сливаете обратно в производственную ветку, которая сливается с основной веткой.

Пожалуйста, исправьте меня, если я ошибаюсь, какЯ работал только над НАМНОГО меньшими проектами, которые используют Git (~ 100 файлов, ~ 15k строк кода).

Ваша поддержка будет высоко оценена.

Спасибо.

1 Ответ

1 голос
/ 21 октября 2019

Создание ветки в Git-копиях ничего .

ОК, это немного преувеличение. Копирует один хэш-идентификатор . То есть предположим, что у вас есть существующее хранилище с N ветвями. Когда вы создаете новую ветку, Git записывает один новый файл с коротким (в настоящее время длиной 40 байт, в конечном итоге длиной 64 байт) идентификатором хэша. Таким образом, если предыдущее использование диска составляло 50 мегабайт, использование нового диска составляет ... 50 мегабайт.

С другой стороны, клонирование хранилище копирует все . Если размер хранилища на сервере S составляет 50 мегабайт, а вы клонируете его на ноутбук L, хранилище на ноутбуке L также составляет 50 мегабайт. 1 Существуют способы уменьшить размер клона (опуская некоторыесовершает), но их следует использовать с осторожностью. В любом случае, в наши дни 50 мегабайт довольно мало. : -)

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

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


1 Это не совсем гарантировано, потому что объекты, хранящиеся в репозиториях Git, "упаковываются". Git будет запускать git gc, сборщик мусора, время от времени, чтобы собирать и выбрасывать мусор и уменьшать размер хранилища, и в зависимости от того, сколько мусора есть в любом данном хранилище, вы можете увидеть разные размеры.

Были различные ошибки, из-за которых Git не запускался git gc --auto достаточно часто (в частности, до 2.17 git commit, пропущенных для запуска auto-gc впоследствии) или из-за которых auto-gc никогда не заканчивал очистку (из-за остатка журнала ошибок от более раннего gc, исправленного в 2.12.2 и 2.13.0). В этих случаях клон может оказаться намного меньше исходного репозитория.

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