我知道如果我在裸存储库中有文件,我可以使用git show HEAD:path/to/file
访问它们。
但是我可以在没有克隆和修改工作树的情况下将新内容添加到裸存储库吗?
答案 0 :(得分:3)
如果我添加1个文件,那个提交中只有1个文件,也就是我们添加了一些新文件,它现在已经在石头上了
在一个简单的仓库中,有几种方便的方法可以将单文件提交添加到主分支的顶端。
所以看来我需要创建一个blob对象,将它附加到树上,然后将该树对象附加到提交中。
所有提交任何事情的方法归结为这样做,这只是一个问题,即方便命令对你的目的有多好。 git add
创建一个blob并在索引中为它创建一个条目; git commit
执行git write-tree
为索引中的内容添加任何新树,以及git commit-tree
添加顶级结果树的提交,以及git update-ref
1}}让HEAD
保持最新状态。 Bare repos确实有一个HEAD
提交,通常附加到(例如符号引用)像master
这样的分支。 。 。
所以git的便利命令几乎已经完成了你想要的任务。特别是只有一个文件,这将非常容易。
例如,假设您的文件显示在~server/data/logs/
中,您用于分发的裸仓库位于~server/repo.git
,您希望提交的文件位于data/logs
repo,你总是想提交最新的日志文件:
#!/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
我收集你已经怀疑可能是一个更好的选择。但是 - 一次一个,每分钟一个新文件,它需要两年才能累积一百万个。那么,?
无论如何,上述过程可以非常有效地扩展到每次提交的任何小数量的文件。对于批量工作,有更好的方法。