Добавление вещей в репозиторий Git bare
Я знаю, что если у меня есть файлы в голом хранилище, я могу получить к ним доступ с помощью git show HEAD:path/to/file
.
Но могу ли я Добавить новый контент в голый репозиторий без клонирования и изменения рабочего дерева?
1 ответ:
Если я добавляю 1 файл, только 1 файл находится в этом коммите, то есть мы добавили что-то новое, и теперь он установлен в камне
Существует несколько удобных способов добавления однофайлового коммита в вершину главной ветви в голом РЕПО.
Таким образом, мне нужно создать объект blob, присоединить его к дереву, а затем присоединить этот объект дерева к фиксации.
Все способы совершить что-либо сводятся к тому, чтобы сделать это, это просто вопрос того, насколько хорошо удобные команды подходят для ваших целей.
Так что удобные команды git уже делают почти то, что вы хотите. Особенно с помощью всего лишь один файл, это будет очень легко.git add
создает большой двоичный объект и делает запись для него в индексе;git commit
делаетgit write-tree
, который добавляет любые новые деревья для того, что находится в индексе, иgit commit-tree
, который добавляет фиксацию результирующего дерева верхнего уровня, иgit update-ref
, чтобы поддерживатьHEAD
в актуальном состоянии. Голые РЕПО имеют коммитHEAD
, обычно прикрепленный к (он же символический ref для) ветви, такой какmaster
,. . .Допустим, ваши файлы отображаются в
~server/data/logs/
, голый РЕПО, который вы используете для распространения, находится в~server/repo.git
, вы хотите, чтобы зафиксированные файлы были вdata/logs
в репо, и вы всегда хотите зафиксировать последний файл журнала:#!/bin/sh cd ~server # supply locations git ordinarily does on its own in working i.e. non-bare repos: export GIT_DIR=$PWD/repo.git # bare repos don't have defaults for these export GIT_WORK_TREE=$PWD # so supply some to suit our purpose export GIT_INDEX_FILE=$GIT_DIR/scratch-index # ... # payload: commit (only) the latest file in data/logs: git read-tree --empty # make the index all pretty, and git add data/logs/`ls -1t data/logs|sed q` # everything's ordinary from here - add and git commit -m'new logfile' # commit
git read-tree
загружает записи индекса из зафиксированных деревьев. Это то, что лежит в основе checkout, merge и reset, и, вероятно, некоторые другие, которые я забываю atm. Здесь мы просто хотим, чтобы пустой индекс начинался, следовательно--empty
.Вы сказали "миллионы" файлов с течением времени, и если вы не хотите, чтобы эта полная история распространялась,Используйте push / pull / remote для синхронизации данных при использовании инструмента, уже доступного на каждой машине
rsync
, как я понимаю, вы уже подозреваете, может быть лучше. Но ... по одному, по одному новому файлу в минуту, потребуется два года, чтобы накопить всего один миллион. Ну и что ?Как бы то ни было, описанная выше процедура довольно эффективно расширяется для любого небольшое количество файлов на коммит. Для объемной работы есть лучшие способы.