是否可以“签出”到存储库之外的位置?我的意思是克隆没有“.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