从远程仓库高效地复制 git 工作树

Efficiently replicate git working tree from remote repo

我的服务器上有一个远程裸仓库。我希望服务器始终将当前工作树作为系统中的真实目录。

我正在使用 post-receive git-hook 和命令来构建工作树并覆盖旧树:

git archive master | tar -x -C /dir/to/my/project/

但是,这种方法有一个问题:它不会删除存储库中 deleted/moved 的文件。

我可以简单地删除整个项目目录,但我想保留我的 .gitignore.

中忽略的所有文件

我尝试编写一个脚本来删除所有未被忽略的文件,但需要几分钟才能处理。

有没有办法在不删除忽略文件的情况下复制工作树?

您可以使用方便的命令添加工作树(不是最好的计划,但可能是可行的)或使用核心命令自己实现您需要的部分(保证始终以相同的方式工作)。

索引是一个清单,一个路径名列表和指向回购内容的指针以及该路径上的文件系统副本的缓存文件系统元数据。

GIT_WORK_TREE=/path/to/your/checkout GIT_INDEX_FILE=/path/to/your/manifest \
        git read-tree -um $commit:$dir

你把工作树和索引放在哪里完全取决于你,Git的核心不关心,只要告诉它(就像我在这里所做的那样)。

Docs for the $commit:$dir revision syntax

git read-tree 是签出、合并、硬重置和任何类似操作的核心命令。