我想在没有.git文件和整个存储库的情况下签出文件。这是因为我想用git管理一个网站(php& html),我正在寻找一种简单的方法来从存储库更新htdocs文件夹中的文件,而不需要公开存储库。 (现在它在home-dir中并通过ssh访问,但我必须手动将新文件放到htdocs。
答案 0 :(得分:31)
git-archive联机帮助页包含以下示例:
git archive --format=tar --prefix=junk/ HEAD | (cd /var/tmp/ && tar xf -)
创建一个tar存档,其中包含当前分支上最新提交的内容,并将其解压缩到'/ var / tmp / junk'目录中。
或者您可以使用低级git-checkout-index,该联机帮助页包含以下示例:
使用git checkout-index“导出整个树”
前缀功能基本上使用“
git checkout-index
”作为“导出为树”功能变得微不足道。只需将所需的树读入索引,然后执行$ git checkout-index --prefix=git-export-dir/ -a
git checkout-index
会将索引“导出”到指定的目录中。最后的“/”很重要。导出的名称实际上只是以指定的字符串为前缀。
或者您可以尝试使用--work-tree
选项来git包装器或GIT_WORK_TREE环境变量,例如使用“git --work-tree=/somwehere/else checkout -- .
”。
答案 1 :(得分:9)
Git比Subversion容易得多,因为整个存储库都保存在一个目录中。您只需要删除项目根目录中隐藏的“.git”文件夹,即可创建站点的生产就绪副本。
在Linux / OSX中,这将是:
mkdir dist && cd dist
git checkout http://path/to/your/project.git
rm -rf .git
答案 2 :(得分:8)
git clone --depth 1
完全符合您的要求。我有一个拥有41,000次提交的git存储库,这个速度要快得多。有关更详细的说明,请参阅this answer或this more general response。
如果要指定要使用的分支(而不是默认的" master"分支),请使用此语法(需要Git 1.9 +):
git clone -b <remoteBranch> --single-branch --depth 1 ssh://username@servername.net:serverport/PathToProject <FolderName>
答案 3 :(得分:5)
您可以在git工作目录中创建tar存档,并将tar复制到服务器:
git archive -o foo.tar HEAD
scp foo.tar server:
答案 4 :(得分:2)
扩展seanhodges的答案,您可以将项目的文件rsync到您需要放置它们的位置并使用--exclude以避免.git目录。
rsync -avz --exclude=.git /source/directory/ user@remote-server.com:/target-directory
我没有测试该命令,所以可以随意编辑它,但是你得到了这个命令。
一个有用的选项是在命令的末尾添加--dry-run,它将显示将发送哪些文件而不实际进行任何更改。
答案 5 :(得分:1)
您可能会受益于裸机还有后接收机。
如果您希望将更改推送到服务器但不希望htdoc本身受版本控制,则此方法很有用。
我们将为裸git repo创建一个文件夹。我喜欢将它放在与htdocs相同的父文件夹中:
mkdir barerepo.git
cd barerepo.git
git --bare init
然后创建一个post-receive钩子文件,使其可执行:
touch hooks/post-receive
chmod ug+x hooks/post-receive
在您喜欢的文本编辑器中编辑post-receive:
GIT_WORK_TREE=/full/path/to/htdocs git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]
现在每次推送到这个裸仓库时,它都会将工作树签出到htdocs。但是htdocs本身并没有受版本控制;在htdocs中运行git status
将给出错误fatal: Not a git repository (or any parent up to mount point /data)
。这只是简单的文件。
请注意,您必须始终从master转到此工作,否则git checkout
将无法知道要检出的分支。