【问题标题】:Adding things to a git bare repository将东西添加到 git 裸存储库
【发布时间】:2015-06-06 01:08:03
【问题描述】:

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

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

【问题讨论】:

  • 你可以在不使用工作树的情况下通过使用低级 git 命令来构建提交,这是一种非常光荣的做事方式,但很少对便利命令进行改进;你可以在不克隆的情况下做到这一点——甚至有很多选择——但是选择一种合理的方式来实现这取决于你想要构建的历史和已经存在的历史之间的关系。那么,请问您是在什么情况下提出这个问题的呢?
  • 上述 git 存储库的内容是小文件,一天可能数百万。虽然我知道随着事情变得越来越大,会产生性能成本,但在极端情况下在服务器上运行数百万个小文件和文件夹的担忧并不好。在研究替代方案时,使用裸存储库可以缓解一些问题
  • 所以一次提交可能包含数百万个文件,您经常或通常不希望一次全部检出,是吗?好的,这很有帮助。下一个问题:是你试图避免无克隆要求的怪物结账,还是什么?要更新一个 repo,你要么必须在同一个文件系统上,要么推送到它,剩下的唯一问题是权衡在哪里做工作和提交结构的细节。
  • 每个文件都有一个关联的提交,它们只会被添加/读取,从未删除/修改过,目前主要担心的是文件系统和磁盘性能的巨大文件/文件夹树跨度>
  • 好的。 git 的构建可以扩展到这样的领域,这只是在这里进行的最佳方式的问题,所以,如果您不想检查所有文件,是否有理由让每个提交都包含它们? . . .但是,真的,这里有足够多的问题,我认为对您正在设置的系统以及您目前如何看待 git 适应它的相当完整的叙述性描述将是最快的,然后我们将能够建议下一步为您提供更清晰的起点。

标签: git git-bare


【解决方案1】:

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

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

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

提交任何事情的所有方法都归结为这样做,这只是便利命令是否适合您的目的的问题。 git add 创建一个 blob 并在索引中为其创建一个条目; git commit 执行 git write-tree 为索引中的内容添加任何新树,git commit-tree 添加顶级结果树的提交,以及 git 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 我猜您已经怀疑可能是一个更好的选择。但是——一次一个,每分钟一个新文件,需要两年时间才能积累一百万。那么,?

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

【讨论】:

    猜你喜欢
    • 2012-11-27
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多