将内容添加到 git 裸存储库

Adding things to a git bare repository

我知道如果我在裸存储库中有文件,我可以使用 git show HEAD:path/to/file.

访问它们

但是我可以在不克隆和修改工作树的情况下向裸存储库添加新内容吗?

if I add 1 file, only the 1 file is in that commit, aka we added something new and it's now set in stone

有几种方便的方法可以将单个文件提交添加到裸仓库中 master 分支的尖端。

So it appears i need to create a blob object, attach it to a tree, then attach that tree object to a commit.

提交任何内容的所有方法都归结为这样做,这只是一个方便的命令在多大程度上适合您的目的的问题。 git add 创建一个 blob 并在索引中为它创建一个条目; git commit 执行 git write-tree 为索引中的内容添加任何新树,git commit-tree 添加顶级结果树的提交,以及 git update-ref 到保持 HEAD 最新。 Bare repos 确实有一个 HEAD 提交,通常附加到(也称为符号引用)像 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 从已提交的树中加载索引条目。它是结帐、合并和重置的基础,可能还有一些我忘记了 atm。在这里,我们只想要一个空索引开始,因此 --empty.

use push/pull/remote to synchronize data while using a tool already available on every machine

你说 "millions" 随着时间的推移文件,如果你不想分发完整的历史记录,rsync 据我所知你已经怀疑可能是更好的选择。但是——一次一个,每分钟一个新文件,要花两年时间才能积累到一百万。那么,?

无论如何,上述过程可以非常有效地扩展到每次提交的任何少量文件。对于批量工作,有更好的方法。