4

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

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

4

1 回答 1

5

如果我添加 1 个文件,则该提交中只有 1 个文件,也就是我们添加了一些新的东西,现在它已经一成不变

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

所以看来我需要创建一个 blob 对象,将其附加到树上,然后将该树对象附加到提交。

提交任何事情的所有方法都归结为这样做,这只是便利命令是否适合您的目的的问题。git add创建一个 blob 并在索引中为其创建一个条目;git commit执行 agit write-tree为索引中的内容添加任何新树, agit commit-tree添加顶级结果树的提交,并 agit update-ref保持HEAD最新。裸仓库确实有一个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.

使用推/拉/远程同步数据,同时使用每台机器上已有的工具

您说随着时间的推移“数百万”个文件,如果您不希望分发完整的历史记录,rsync据我所知,您已经怀疑可能是一个更好的选择。但是——一次一个,每分钟一个新文件,需要两年时间才能积累一百万。所以, ?

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

于 2015-04-01T17:17:17.353 回答