Добавление вещей в репозиторий Git bare


Я знаю, что если у меня есть файлы в голом хранилище, я могу получить к ним доступ с помощью git show HEAD:path/to/file.

Но могу ли я Добавить новый контент в голый репозиторий без клонирования и изменения рабочего дерева?

1 2

1 ответ:

Если я добавляю 1 файл, только 1 файл находится в этом коммите, то есть мы добавили что-то новое, и теперь он установлен в камне

Существует несколько удобных способов добавления однофайлового коммита в вершину главной ветви в голом РЕПО.

Таким образом, мне нужно создать объект blob, присоединить его к дереву, а затем присоединить этот объект дерева к фиксации.

Все способы совершить что-либо сводятся к тому, чтобы сделать это, это просто вопрос того, насколько хорошо удобные команды подходят для ваших целей. git add создает большой двоичный объект и делает запись для него в индексе; git commit делает git write-tree, который добавляет любые новые деревья для того, что находится в индексе, и git commit-tree, который добавляет фиксацию результирующего дерева верхнего уровня, и git update-ref, чтобы поддерживать HEAD в актуальном состоянии. Голые РЕПО имеют коммит HEAD, обычно прикрепленный к (он же символический ref для) ветви, такой как master,. . .

Так что удобные команды git уже делают почти то, что вы хотите. Особенно с помощью всего лишь один файл, это будет очень легко.

Допустим, ваши файлы отображаются в ~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, как я понимаю, вы уже подозреваете, может быть лучше. Но ... по одному, по одному новому файлу в минуту, потребуется два года, чтобы накопить всего один миллион. Ну и что ?

Как бы то ни было, описанная выше процедура довольно эффективно расширяется для любого небольшое количество файлов на коммит. Для объемной работы есть лучшие способы.