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

use*_*826 21 git checkout

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

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

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

Zor*_*che 20

是的,这当然是可能的。

假设我有一个/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.
Run Code Online (Sandbox Code Playgroud)

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


slh*_*hck 6

如果你只想要文件,你可以使用git archive. 通常它会写入压缩包或 ZIP 之类的存档,但您也可以通过管道传输它:

git archive master | tar -x -C /some/path
Run Code Online (Sandbox Code Playgroud)

在这里,master显然是您要存档的分支,并且/some/path将仅包含文件 - no.git.gitignore.


或者您可以使用git checkout-index更类似于文件的“结帐”:

git checkout-index -f -a --prefix=/some/path/
Run Code Online (Sandbox Code Playgroud)

在这里,该-a选项告诉git检查所有文件。前缀将被添加到输出中。有人还为此编写了一个包装器以提供git export.

  • 我认为你让这变得比需要的更困难。只需运行`GIT_WORK_TREE=/destinationpath git checkout -f`,而您的当前目录位于裸存储库或.git 子目录的顶部。您将结帐到 /destinationpath (2认同)