将 Git 文件签出到存储库之外的位置

将 Git 文件签出到存储库之外的位置

是否可以“签出”到存储库之外的位置?我的意思是克隆没有“.git”目录的分支。

例如:使用 git 管理网站。您编辑一些文件,通过 WebDAV 提交并将文件复制到 Web 服务器。WebDAV 路径将是存储库之外的位置,不应包含“.git”。

这可能不是 git 构建的问题,但这可能吗?

答案1

是的,这当然是可能的。

假设我/srv/production.git在目标系统/服务器上有一个名为的裸存储库。

在目标系统上我可以使用命令cd /srv/production.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

如果我处于非裸存储库中,命令会略有不同。假设我在 有一个非裸存储库/srv/testing。要签出,我会使用cd /srv/testing/.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f

事实上,在我的系统上,我甚至在存储库中的提交后挂钩中自动执行此操作production.git。因此,当您推送到production.git最新版本时,会自动签出到 Web 根目录。

#!/bin/sh
#
# An example hook script that is called after a successful
# commit is made.
#
# To enable this hook, rename this file to "post-commit".

GIT_WORK_TREE=/srv/production-www/ git checkout -f
# ... misc other commands to verify permissions are set correctly.

如果您对远程系统的唯一访问权限是 webdav,那么当然应该可以编写一个提交后钩子,该钩子将直接或临时检出到 webdav 主机,然后您可以编写上传脚本。

答案2

如果你只想要文件,你可以使用git archive。通常它会写入像 tarball 或 ZIP 这样的存档,但您也可以通过管道传输它:

git archive master | tar -x -C /some/path

这里master显然是您想要存档的分支,并且/some/path只包含文件 – 没有.git.gitignore


或者你可以使用git checkout-index这更像是文件的“签出”:

git checkout-index -f -a --prefix=/some/path/

这里,-a选项告诉git检查所有文件。前缀将被添加到输出中。有人还写道围绕这个的包装给予git export

答案3

从 Git 开始1.8.5, 您可以使用-C <path>选项,运行起来就像 git 是在 中启动的<path>,而不是在当前工作目录中。

较旧的 Git版本,使用--work-tree选项。例如:

repo_url=https://github.com/owner/project.git
repo_dir=$(basename $repo_url .git)
git clone $repo_url
git --work-tree=$repo_dir checkout $branch

相关内容