将裸仓库中一个目录的内容复制到仓库外的目录

Copy content of one directory in bare repo to directory outside repo

我正在尝试将我的部署工作流程从通过 FTP 发送文件更改为 git 部署。我正在关注 this post.

git --work-tree=/var/www/domain.com --git-dir=/var/repo/site.git checkout -f

问题是上面的命令将整个 repo 的内容复制到另一个目录。我只需要复制 dist 目录的内容。我怎样才能做到这一点?

如您所知,裸存储库没有工作目录。

最简单的方法是将存储库克隆到新位置并复制文件夹的内容。

# clone the repo
git clone <url>

# Grab the desired folder from the desired branch and that it.

另一种选择是克隆存储库,然后 split 出所需的文件夹

subtree split

git subtree git-subtree - Merge subtrees together or split repository into subtrees

git subtree split -P <name-of-folder> -b <name-of-new-branch>

that command above copies content of entire repo to another directory

在git 术语中,它所做的是检查提交。要只检查提交的一部分,您必须告诉它只读出一些已提交的树。

附带说明一下,git 不是为部署服务器而构建的。也就是说,它足够简单和灵活,因此在这里随心所欲地使用它是相当受欢迎的,并且工作得很好。

Git 维护一个索引文件,该文件将工作树中的内容与存储库中的内容相关联。因此,如果您想使用 git 来管理任意工作树中的内容,则必须为该工作树保留一个索引文件。

(
  # git ordinarily finds these for itself, but we're not using default behavior:
  export GIT_DIR=/var/repo/site.git
  export GIT_INDEX_FILE=$GIT_DIR/domain.com.index
  export GIT_WORK_TREE=/var/www/domain.com

  git read-tree -um `git write-tree` HEAD:dist     # or master:dist, or any tree reference
)

git write-tree 为您提供索引中当前列出的任何内容的树(空文件或不存在的文件与 "nothing's here yet" 索引一样正常工作)。 git read-tree -um 有两棵树是结帐的基础,它根本不关心引用,甚至不关心 HEAD;它仅与树和索引有关。