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


21

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

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

这可能不是生成git的问题,但这可能吗?

Answers:


19

是的,这肯定是可能的。

可以说我/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主机,也可以检出到临时位置,然后您可以编写上载脚本。


在多个地方搜索..只有有效的解决方案,也很干净!
karthikeayan

6

如果只需要文件,则可以使用git archive。通常,它会写入诸如tarball或ZIP之类的档案,但是您也可以通过管道将其归档:

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

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


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

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

在这里,该-a选项指示git检出所有文件。前缀将添加到输出之前。有人还写了解决这个包装给予git export


2
我认为您正在使这一过程变得更加困难。只需GIT_WORK_TREE=/destinationpath git checkout -f在当前目录位于裸存储库或.git子目录的顶部时运行。您将结帐到/ destinationpath
Zoredache

好吧,我一定有某种机会错过了该选项+1。
slhck

1
老实说,我发现此选项更直观。并且更少出错。
Minix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.